00001
00002 #include "VisReco/VisTracker/interface/VisTkIdealHelixTracksTwig.h"
00003 #include "VisFramework/VisFrameworkBase/interface/VisTwigFactroyService.h"
00004 #include "VisFramework/VisFrameworkBase/interface/VisEventSelector.h"
00005 #include "VisFramework/VisFrameworkBase/interface/debug.h"
00006
00007 #include "DataFormats/TrackReco/interface/Track.h"
00008 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00009 #include "DataFormats/TrackReco/interface/TrackBase.h"
00010 #include "FWCore/Framework/interface/Event.h"
00011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00012
00013 #include "DataFormats/TrackReco/interface/Track.h"
00014
00015 #include "Iguana/Inventor/interface/IgSoIdealTrack.h"
00016 #include "Iguana/Inventor/interface/IgSoSimpleTrajectory.h"
00017 #include "Iguana/Inventor/interface/IgParticleChar.h"
00018 #include "Iguana/Models/interface/IgTextRep.h"
00019 #include "Iguana/GLModels/interface/Ig3DRep.h"
00020 #include "Iguana/GLModels/interface/IgRPhiRep.h"
00021 #include "Iguana/GLModels/interface/IgRZRep.h"
00022 #include "Iguana/GLModels/interface/IgLegoRep.h"
00023 #include "Iguana/Framework/interface/IgRepSet.h"
00024 #include "Iguana/Studio/interface/IgQtLock.h"
00025
00026 #include <Inventor/nodes/SoMaterial.h>
00027 #include <Inventor/nodes/SoSeparator.h>
00028 #include <Inventor/nodes/SoDrawStyle.h>
00029 #include <qmessagebox.h>
00030 #include <qstring.h>
00031 #include <classlib/utils/Error.h>
00032 #include <sstream>
00033 #include <iomanip>
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 namespace
00046 {
00047 VisQueuedTwig *
00048 createThisTwig (IgState *state, IgTwig *parent,
00049 const std::string &name,
00050 const std::string &friendlyName,
00051 const std::string &modLabel,
00052 const std::string &instanceName,
00053 const std::string &processName)
00054 {
00055 return new VisTkIdealHelixTracksTwig (state, parent, "Tracker reconstructed tracks (" + name + ")",
00056 friendlyName, modLabel, instanceName, processName);
00057 }
00058 }
00059
00060
00061
00062
00063 VisTkIdealHelixTracksTwig::VisTkIdealHelixTracksTwig (IgState *state, IgTwig *parent,
00064 const std::string &name ,
00065 const std::string &friendlyName ,
00066 const std::string &moduleLabel ,
00067 const std::string &instanceName ,
00068 const std::string &processName )
00069 : VisQueuedTwig (state, parent, name),
00070 m_text ("no info"),
00071 m_friendlyName (friendlyName),
00072 m_moduleLabel (moduleLabel),
00073 m_instanceName (instanceName),
00074 m_processName (processName),
00075 m_animate (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00076 m_counterMax (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00077 m_counterMin (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00078 m_frequency (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00079 m_BField (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00080 m_RMax (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00081 m_ZMax (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00082 m_t0 (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00083 m_dt (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00084 m_annot (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged)),
00085 m_showDets (state, lat::CreateCallback (this, &VisTkIdealHelixTracksTwig::twigChanged))
00086 {
00087 VisTwigFactroyService *tfService = VisTwigFactroyService::get (state);
00088 if (! tfService)
00089 {
00090 tfService = new VisTwigFactroyService (state);
00091 }
00092 edm::TypeID trackID (typeid (reco::TrackCollection));
00093 tfService->registerTwig (trackID.friendlyClassName (), &createThisTwig);
00094 pset = VisConfigurationService::pSet ();
00095 if (! pset)
00096 {
00097 edm::ParameterSet p;
00098 VisConfigurationService *visService = new VisConfigurationService (p);
00099 pset = visService->pSet ();
00100 delete visService;
00101 }
00102 trackThickness = pset->getUntrackedParameter<double> ("trackLineThickness", 2.0);
00103
00104 m_flytime = pset->getUntrackedParameter<double> ("flyTime", 0.5);
00105
00106 std::vector<std::string> notSpecified;
00107 m_trackCollectionNames = pset->getUntrackedParameter<std::vector<std::string> > ("trackCollectionNames", notSpecified);
00108 }
00109
00110 void
00111 VisTkIdealHelixTracksTwig::twigChanged (void)
00112 { IgRepSet::invalidate (this, SELF_MASK); }
00113
00114 void
00115 VisTkIdealHelixTracksTwig::onNewEvent (const edm::Event &event,
00116 const edm::EventSetup &eventSetup)
00117 {
00118
00119 VisQueuedTwig::onNewEvent (event, eventSetup);
00120
00121 m_tracks.clear ();
00122
00123 m_trajectoryPositions.clear ();
00124 m_trajectoryDirections.clear ();
00125
00126 m_text = (QString ("Run # %1, event # %2")
00127 .arg (event.id ().run ())
00128 .arg (event.id ().event ()).latin1 ());
00129
00130 std::vector<edm::Handle<reco::TrackCollection> > trackCollections;
00131
00132 try
00133 {
00134 if ((! m_friendlyName.empty ()) || (! m_moduleLabel.empty ()) || (! m_instanceName.empty ()) || (! m_processName.empty ()))
00135 {
00136 VisEventSelector visSel (m_friendlyName, m_moduleLabel, m_instanceName, m_processName);
00137 event.getMany (visSel, trackCollections);
00138 }
00139 else
00140 {
00141 if (m_trackCollectionNames.empty ())
00142 event.getManyByType (trackCollections);
00143 else
00144 {
00145 for(std::vector<std::string>::iterator tkColl = m_trackCollectionNames.begin (), tkCollEnd = m_trackCollectionNames.end ();
00146 tkColl != tkCollEnd; ++tkColl)
00147 {
00148 LOG (2, trace, LFfwvis, "Getting track Collection with label " << (*tkColl) << "\n");
00149
00150 edm::Handle<reco::TrackCollection> tcHandle;
00151
00152 event.getByLabel ((*tkColl), tcHandle);
00153 trackCollections.push_back (tcHandle);
00154 }
00155 }
00156 }
00157 }
00158 catch (cms::Exception& e)
00159 {
00160 e.append (" from VisTkIdealHelixTracksTwig: ");
00161 e.append (this->name ());
00162
00163 if (this->m_onCmsException)
00164 this->m_onCmsException (&e);
00165 }
00166 catch (lat::Error &e)
00167 {
00168 if (this->m_onError)
00169 this->m_onError (&e);
00170 }
00171 catch (std::exception &e)
00172 {
00173 if (this->m_onException)
00174 this->m_onException (&e);
00175 }
00176 catch (...)
00177 {
00178 if (this->m_onUnhandledException)
00179 this->m_onUnhandledException ();
00180 }
00181
00182 if (! trackCollections.empty ())
00183 {
00184 std::vector<edm::Handle<reco::TrackCollection> >::iterator i;
00185 std::vector<edm::Handle<reco::TrackCollection> >::iterator iEnd;
00186
00187 LOG (2, trace, LFfwvis, "There are " << trackCollections.size () << " track collections.\n");
00188 int tc = 1;
00189
00190 for (i = trackCollections.begin (), iEnd = trackCollections.end (); i != iEnd; ++i)
00191 {
00192 try
00193 {
00194 const reco::TrackCollection c = *(*i).product ();
00195 LOG (3, trace, LFfwvis, "#" << tc++ << ": track collection has " << c.size () << " tracks\n");
00196 for (reco::TrackCollection::const_iterator track = c.begin (), cEnd = c.end (); track != cEnd; ++track)
00197 {
00198 m_tracks.push_back (*track);
00199 LOG (3, trace, LFfwvis, "\nTrack with rechitsize = " << (*track).recHitsSize () << "\n");
00200
00201 LOG (3, trace, LFfwvis, "\nConvert failed, use Inner and Onter States " << "\n");
00202
00203 std::vector<SbVec3f> myTraPos;
00204 std::vector<SbVec3f> myTraDir;
00205
00206 if ((*track).innerOk () && (*track).outerOk ())
00207 {
00208
00209 float x = (*track).innerPosition ().x () / 100.0;
00210 float y = (*track).innerPosition ().y () / 100.0;
00211 float z = (*track).innerPosition ().z () / 100.0;
00212
00213 float dirx = (*track).innerMomentum ().x ();
00214 float diry = (*track).innerMomentum ().y ();
00215 float dirz = (*track).innerMomentum ().z ();
00216
00217 myTraPos.push_back (SbVec3f (x, y, z));
00218 myTraDir.push_back (SbVec3f (dirx, diry, dirz));
00219
00220 x = (*track).outerPosition ().x () / 100.0;
00221 y = (*track).outerPosition ().y () / 100.0;
00222 z = (*track).outerPosition ().z () / 100.0;
00223
00224 dirx = (*track).outerMomentum ().x ();
00225 diry = (*track).outerMomentum ().y ();
00226 dirz = (*track).outerMomentum ().z ();
00227
00228 myTraPos.push_back (SbVec3f (x, y, z));
00229 myTraDir.push_back (SbVec3f (dirx, diry, dirz));
00230 }
00231 else
00232 {
00233 LOG (2, trace, LFfwvis, "\nOuter or Inner not OK\n");
00234 }
00235
00236 m_trajectoryPositions.push_back (myTraPos);
00237 m_trajectoryDirections.push_back (myTraDir);
00238 }
00239 }
00240 catch (cms::Exception& e)
00241 {
00242 if (this->m_onCmsException)
00243 this->m_onCmsException (&e);
00244 }
00245 catch (lat::Error &e)
00246 {
00247 if (this->m_onError)
00248 this->m_onError (&e);
00249 }
00250 catch (std::exception &e)
00251 {
00252 if (this->m_onException)
00253 this->m_onException (&e);
00254 }
00255 catch (...)
00256 {
00257 if (this->m_onUnhandledException)
00258 this->m_onUnhandledException ();
00259 }
00260 }
00261 }
00262
00263 VisQueuedTwig::onBaseInvalidate ();
00264 }
00265
00266 void
00267 VisTkIdealHelixTracksTwig::update (IgTextRep *rep)
00268 {
00269
00270 VisQueuedTwig::update (rep);
00271
00272
00273 std::ostringstream text;
00274
00275 text << setiosflags (std::ios::showpoint | std::ios::fixed);
00276 text.setf (std::ios::right, std::ios::adjustfield);
00277
00278 text << "Reconstructed Tracks = ";
00279
00280 try
00281 {
00282 unsigned int tracks_size = m_tracks.size ();
00283
00284 std::vector<std::vector<SbVec3f> >::const_iterator ipos = m_trajectoryPositions.begin ();
00285 std::vector<std::vector<SbVec3f> >::const_iterator idir = m_trajectoryDirections.begin ();
00286
00287 for (unsigned int nt = 0; nt < tracks_size; nt++)
00288 {
00289 std::ostringstream out_pt;
00290 out_pt << m_tracks [nt].pt ();
00291 text << "<table width='100%' border=1>"
00292 << "<TR align = center>"
00293 << "<TD COLSPAN =4>Track number = " << nt
00294 << " track pt = " << out_pt.str ()
00295 << "</TR>";
00296
00297 int nState = 0;
00298
00299 std::vector<SbVec3f>::const_iterator idd = (*idir).begin ();
00300 for (std::vector<SbVec3f>::const_iterator ipp = (*ipos).begin (); ipp != (*ipos).end (); ++ipp)
00301 {
00302 text << "<TR align = right>"
00303 << "<TD>" << std::setw (3) << nState++<< "</TD>"
00304 << "<TD>" << std::setw (6) << std::setprecision (3) << (*ipp)[0] << "," << (*ipp)[1] << "," << (*ipp)[2] << "</TD>"
00305 << "<TD>" << std::setw (6) << std::setprecision (3) << (*idd)[0] << "," << (*idd)[1] << "," << (*idd)[2] << "</TD></TR>";
00306 idd++;
00307 }
00308 text << "</table>";
00309 }
00310 }
00311 catch (cms::Exception& e)
00312 {
00313 if (this->m_onCmsException)
00314 this->m_onCmsException (&e);
00315 }
00316 catch (lat::Error &e)
00317 {
00318 if (this->m_onError)
00319 this->m_onError (&e);
00320 }
00321 catch (std::exception &e)
00322 {
00323 if (this->m_onException)
00324 this->m_onException (&e);
00325 }
00326 catch (...)
00327 {
00328 if (this->m_onUnhandledException)
00329 this->m_onUnhandledException ();
00330 }
00331
00332 IgQtLock ();
00333 rep->setText (text.str ());
00334 }
00335
00336 void
00337 VisTkIdealHelixTracksTwig::update (Ig3DRep *rep)
00338 {
00339
00340 VisQueuedTwig::update (rep);
00341
00342 IgQtLock ();
00343 rep->clear ();
00344
00345 if (! m_tracks.empty ())
00346 {
00347 SoSeparator *sep = new SoSeparator;
00348
00349 SoMaterial *recomat = new SoMaterial;
00350 recomat->diffuseColor.setValue (1.0, 0.0, 0.0);
00351 sep->addChild (recomat);
00352
00353 SoDrawStyle *sty = new SoDrawStyle;
00354 sty->style = SoDrawStyle::LINES;
00355 sty->lineWidth.setValue (trackThickness);
00356 sep->addChild (sty);
00357
00358 if (!m_trajectoryPositions.empty () && !m_trajectoryDirections.empty ())
00359 {
00360 std::vector<std::vector<SbVec3f> >::const_iterator ipos = m_trajectoryPositions.begin ();
00361 std::vector<std::vector<SbVec3f> >::const_iterator idir = m_trajectoryDirections.begin ();
00362
00363 for (std::vector<reco::Track>::const_iterator itrack = m_tracks.begin (), itrackEnd = m_tracks.end (); itrack != itrackEnd; ++itrack)
00364 {
00365 int nState = 0;
00366 std::vector<SbVec3f>::const_iterator idd = (*idir).begin ();
00367 for (std::vector<SbVec3f>::const_iterator ipp = (*ipos).begin (); ipp != (*ipos).end (); ++ipp)
00368 {
00369 if ((*itrack).charge() > 0)
00370 {
00371 IgSoIdealTrack* myTraj = new IgSoIdealTrack;
00372 myTraj->setBField (m_BField.value ());
00373 myTraj->setRMax (m_RMax.value ());
00374 myTraj->setZMax (m_ZMax.value ());
00375 myTraj->t0.setValue (m_t0.value ());
00376 myTraj->dt.setValue (m_dt.value ());
00377 myTraj->initialise ((*ipp)[0], (*ipp)[1], (*ipp)[2],
00378 (*idd)[0], (*idd)[1], (*idd)[2],
00379 m_flytime,
00380 IgParticleChar::getByName ("muon"));
00381 sep->addChild (myTraj);
00382 }
00383 else if ((*itrack).charge() < 0)
00384 {
00385 IgSoIdealTrack* myTraj = new IgSoIdealTrack;
00386 myTraj->setBField (m_BField.value ());
00387 myTraj->setRMax (m_RMax.value ());
00388 myTraj->setZMax (m_ZMax.value ());
00389 myTraj->t0.setValue (m_t0.value ());
00390 myTraj->dt.setValue (m_dt.value ());
00391 myTraj->initialise ((*ipp)[0], (*ipp)[1], (*ipp)[2],
00392 (*idd)[0], (*idd)[1], (*idd)[2],
00393 m_flytime,
00394 IgParticleChar::getByName ("electron"));
00395 sep->addChild (myTraj);
00396 }
00397 else
00398 {
00399 SoSeparator *gammas = new SoSeparator;
00400 SoMaterial *gammaMaterial = new SoMaterial;
00401 gammaMaterial->ambientColor.setValue (0.000, 0.000, 0.000);
00402 gammaMaterial->diffuseColor.setValue (1.000, 1.000, 0.000);
00403 gammaMaterial->emissiveColor.setValue (1.000, 1.000, 0.000);
00404 gammaMaterial->specularColor.setValue (0.000, 0.000, 0.000);
00405 gammaMaterial->shininess = 0.0;
00406 gammaMaterial->transparency = 0.0;
00407 gammas->addChild (gammaMaterial);
00408
00409 IgSoSimpleTrajectory *track = new IgSoSimpleTrajectory;
00410
00411 track->controlPoints.set1Value (0, SbVec3f ((*ipp)[0], (*ipp)[1], (*ipp)[2]));
00412 track->markerPoints.set1Value (0, SbVec3f ((*ipp)[0], (*ipp)[1], (*ipp)[2]));
00413
00414 track->controlPoints.set1Value (1, SbVec3f ((*ipp)[0], (*ipp)[1], (*ipp)[2]));
00415 track->markerPoints.set1Value (1, SbVec3f ((*ipp)[0] * 10, (*ipp)[1] * 10, (*ipp)[2] * 10));
00416 gammas->addChild (track);
00417
00418 sep->addChild (gammas);
00419 }
00420
00421 nState++;
00422 idd++;
00423 }
00424 ipos++;
00425 idir++;
00426 }
00427 }
00428 rep->node ()->addChild (sep);
00429 }
00430 }
00431
00432 void
00433 VisTkIdealHelixTracksTwig::update (IgRPhiRep *rep)
00434 {
00435
00436 VisQueuedTwig::update (rep);
00437
00438 IgQtLock ();
00439 rep->clear ();
00440
00441 if (! m_tracks.empty ())
00442 {
00443 SoSeparator *sep = new SoSeparator;
00444
00445 SoMaterial *recomat = new SoMaterial;
00446 recomat->diffuseColor.setValue (1.0, 0.0, 0.0);
00447 sep->addChild (recomat);
00448
00449 SoDrawStyle *sty = new SoDrawStyle;
00450 sty->style = SoDrawStyle::LINES;
00451 sty->lineWidth.setValue (trackThickness);
00452 sep->addChild (sty);
00453
00454 if (! m_trajectoryPositions.empty () && ! m_trajectoryDirections.empty ())
00455 {
00456 std::vector<std::vector<SbVec3f> >::const_iterator ipos = m_trajectoryPositions.begin ();
00457 std::vector<std::vector<SbVec3f> >::const_iterator idir = m_trajectoryDirections.begin ();
00458
00459 for (std::vector<reco::Track>::const_iterator itrack = m_tracks.begin (); itrack != m_tracks.end (); ++itrack)
00460 {
00461 int nState = 0;
00462 std::vector<SbVec3f>::const_iterator idd = (*idir).begin ();
00463 for (std::vector<SbVec3f>::const_iterator ipp = (*ipos).begin (); ipp != (*ipos).end (); ++ipp)
00464 {
00465 IgSoIdealTrack* myTraj = new IgSoIdealTrack;
00466 myTraj->setBField (m_BField.value ());
00467 myTraj->setRMax (m_RMax.value ());
00468 myTraj->setZMax (m_ZMax.value ());
00469 myTraj->t0.setValue (m_t0.value ());
00470 myTraj->dt.setValue (m_dt.value ());
00471 if ((*itrack).charge() > 0)
00472 {
00473 myTraj->initialise ((*ipp)[0], (*ipp)[1], (*ipp)[2],
00474 (*idd)[0], (*idd)[1], (*idd)[2],
00475 m_flytime,
00476 IgParticleChar::getByName ("muon"));
00477 }
00478 else if ((*itrack).charge() < 0)
00479 {
00480 myTraj->initialise ((*ipp)[0], (*ipp)[1], (*ipp)[2],
00481 (*idd)[0], (*idd)[1], (*idd)[2],
00482 m_flytime,
00483 IgParticleChar::getByName ("electron"));
00484 } else
00485 {
00486 myTraj->initialise ((*ipp)[0], (*ipp)[1], (*ipp)[2],
00487 (*idd)[0], (*idd)[1], (*idd)[2],
00488 m_flytime,
00489 IgParticleChar::getByName ("gamma"));
00490 }
00491
00492 sep->addChild (myTraj);
00493 nState++;
00494 idd++;
00495 }
00496 ipos++;
00497 idir++;
00498 }
00499 }
00500 rep->node ()->addChild (sep);
00501 }
00502 }
00503
00504
00505 void
00506 VisTkIdealHelixTracksTwig::update (IgRZRep *rep)
00507 {
00508
00509 VisQueuedTwig::update (rep);
00510
00511 IgQtLock ();
00512 rep->clear ();
00513
00514 if (! m_tracks.empty ())
00515 {
00516 SoSeparator *sep = new SoSeparator;
00517
00518 SoMaterial *recomat = new SoMaterial;
00519 recomat->diffuseColor.setValue (1.0, 0.0, 0.0);
00520 sep->addChild (recomat);
00521
00522 SoDrawStyle *sty = new SoDrawStyle;
00523 sty->style = SoDrawStyle::LINES;
00524 sty->lineWidth.setValue (trackThickness);
00525 sep->addChild (sty);
00526
00527 if (!m_trajectoryPositions.empty () && !m_trajectoryDirections.empty ())
00528 {
00529 std::vector<std::vector<SbVec3f> >::const_iterator ipos = m_trajectoryPositions.begin ();
00530 std::vector<std::vector<SbVec3f> >::const_iterator idir = m_trajectoryDirections.begin ();
00531 for (std::vector<reco::Track>::const_iterator itrack = m_tracks.begin (); itrack != m_tracks.end (); ++itrack)
00532 {
00533 int nState = 0;
00534 std::vector<SbVec3f>::const_iterator idd = (*idir).begin ();
00535 for (std::vector<SbVec3f>::const_iterator ipp = (*ipos).begin (); ipp != (*ipos).end (); ++ipp)
00536 {
00537 IgSoIdealTrack* myTraj = new IgSoIdealTrack;
00538 myTraj->setBField (m_BField.value ());
00539 myTraj->setRMax (m_RMax.value ());
00540 myTraj->setZMax (m_ZMax.value ());
00541 myTraj->t0.setValue (m_t0.value ());
00542 myTraj->dt.setValue (m_dt.value ());
00543 if ((*itrack).charge() > 0)
00544 {
00545 myTraj->initialise ((*ipp)[0], (*ipp)[1], (*ipp)[2],
00546 (*idd)[0], (*idd)[1], (*idd)[2],
00547 m_flytime,
00548 IgParticleChar::getByName ("muon"));
00549 }
00550 else if ((*itrack).charge() < 0)
00551 {
00552 myTraj->initialise ((*ipp)[0], (*ipp)[1], (*ipp)[2],
00553 (*idd)[0], (*idd)[1], (*idd)[2],
00554 m_flytime,
00555 IgParticleChar::getByName ("electron"));
00556 } else
00557 {
00558 myTraj->initialise ((*ipp)[0], (*ipp)[1], (*ipp)[2],
00559 (*idd)[0], (*idd)[1], (*idd)[2],
00560 m_flytime,
00561 IgParticleChar::getByName ("gamma"));
00562 }
00563
00564 sep->addChild (myTraj);
00565 nState++;
00566 idd++;
00567 }
00568 ipos++;
00569 idir++;
00570 }
00571 }
00572 rep->node ()->addChild (sep);
00573 }
00574 }
00575
00576 void
00577 VisTkIdealHelixTracksTwig::update (IgLegoRep *rep)
00578 {
00579
00580
00581 VisQueuedTwig::update (rep);
00582
00583 IgQtLock ();
00584 rep->clear ();
00585
00586
00587 }
00588