CMS 3D CMS Logo

MuonRoadTrajectoryBuilder Class Reference

#include <RecoMuon/L3TrackFinder/interface/MuonRoadTrajectoryBuilder.h>

Inheritance diagram for MuonRoadTrajectoryBuilder:

TrajectoryBuilder

List of all members.

Public Member Functions

 MuonRoadTrajectoryBuilder (const edm::ParameterSet &par, const MeasurementTracker *mt, const MagneticField *f, const Propagator *p)
 constructor from PSet and things from record
void setEvent (const edm::Event &) const
void trajectories (const TrajectorySeed &seed, TrajectoryContainer &ret) const
 process the seed, in a faster manner.
std::vector< Trajectorytrajectories (const TrajectorySeed &seed) const
 ~MuonRoadTrajectoryBuilder ()

Private Types

typedef std::list< trajectoryTrajectoryCollection
typedef flippingPair
< TrajectoryCollection
TrajectoryCollectionFPair

Private Member Functions

void checkDuplicate (TrajectoryCollection &collection) const
bool checkStep (TrajectoryCollection &collection) const
void cleanTrajectory (Trajectory &traj) const
int GatherHits (const TrajectoryStateOnSurface &step, const DetLayer *thislayer, TrajectoryCollectionFPair &Trajectories) const
void makeTrajectories (const TrajectorySeed &seed, std::vector< Trajectory > &result, int version=0) const
void makeTrajectories_0 (const TrajectorySeed &seed, std::vector< Trajectory > &result) const
void makeTrajectories_1 (const TrajectorySeed &seed, std::vector< Trajectory > &result) const
Trajectory smooth (Trajectory &) const

Private Attributes

bool theBranchonfirstlayer
bool theCarriedIPatfirstlayer
bool theCarriedIPatfirstlayerModule
std::string theCategory
 Info/Debug category "Muon|RecoMuon|MuonRoadTrajectoryBuilder".
bool theDynamicMaxNumberOfHitPerModule
const MagneticFieldtheField
bool theFirstlayer
Chi2MeasurementEstimatortheHitEstimator
uint theMaxTrajectories
std::vector< uint > theMaxTrajectoriesThreshold
const MeasurementTrackertheMeasurementTracker
unsigned int theMinNumberOfHitOnCandidate
uint theNumberOfHitPerModule
uint theNumberOfHitPerModuleDefault
std::vector< uint > theNumberOfHitPerModuleThreshold
bool theOutputAllTraj
const PropagatorthePropagator
Chi2MeasurementEstimatortheRoadEstimator
KFTrajectorySmoothertheSmoother
TrajectoryStateTransform theTransformer
TrajectoryStateUpdatortheUpdator

Classes

class  flippingPair
class  trajectory
 for the trajectory collection More...


Detailed Description

Definition at line 55 of file MuonRoadTrajectoryBuilder.h.


Member Typedef Documentation

typedef std::list< trajectory > MuonRoadTrajectoryBuilder::TrajectoryCollection [private]

Definition at line 103 of file MuonRoadTrajectoryBuilder.h.

typedef flippingPair<TrajectoryCollection> MuonRoadTrajectoryBuilder::TrajectoryCollectionFPair [private]

Definition at line 104 of file MuonRoadTrajectoryBuilder.h.


Constructor & Destructor Documentation

MuonRoadTrajectoryBuilder::MuonRoadTrajectoryBuilder ( const edm::ParameterSet par,
const MeasurementTracker mt,
const MagneticField f,
const Propagator p 
)

constructor from PSet and things from record

Definition at line 40 of file MuonRoadTrajectoryBuilder.cc.

References Chi2MeasurementEstimatorESProducer_cfi::Chi2MeasurementEstimator, edm::ParameterSet::getParameter(), KFTrajectorySmootherESProducer_cfi::KFTrajectorySmoother, funct::sqrt(), theBranchonfirstlayer, theCarriedIPatfirstlayer, theCarriedIPatfirstlayerModule, theCategory, theDynamicMaxNumberOfHitPerModule, theField, theHitEstimator, theMaxTrajectories, theMaxTrajectoriesThreshold, theMeasurementTracker, theMinNumberOfHitOnCandidate, theNumberOfHitPerModuleDefault, theNumberOfHitPerModuleThreshold, theOutputAllTraj, thePropagator, theRoadEstimator, theSmoother, and theUpdator.

00043                                                                       :
00044   theRoadEstimator(0),theHitEstimator(0),theUpdator(0),theSmoother(0)
00045 {
00046 
00047   theMeasurementTracker = mt;
00048   theField = f;
00049   thePropagator = p;
00050 
00051   theCategory = "Muon|RecoMuon|MuonRoadTrajectoryBuilder";
00052 
00053   //get parameters from ParameterSet
00054 
00055   //propagator name to get from muon service
00056   //  thePropagatorName = iConfig.getParameter<std::string>("propagatorName");
00057 
00058   //chi2 estimator
00059   double chi2R=iConfig.getParameter<double>("maxChi2Road");
00060   theRoadEstimator = new Chi2MeasurementEstimator(chi2R,sqrt(chi2R));
00061   double chi2H=iConfig.getParameter<double>("maxChi2Hit");
00062   theHitEstimator = new Chi2MeasurementEstimator(chi2H,sqrt(chi2H));
00063 
00064   //trajectory updator
00065   theUpdator= new KFUpdator();
00066 
00067   //limit the total number of possible trajectories taken into account for a single seed
00068   theMaxTrajectories = iConfig.getParameter<uint>("maxTrajectories");
00069 
00070   //limit the type of module considered to gather rechits
00071   theDynamicMaxNumberOfHitPerModule = iConfig.getParameter<bool>("dynamicMaxNumberOfHitPerModule");
00072   theNumberOfHitPerModuleDefault = iConfig.getParameter<uint>("numberOfHitPerModule");
00073   theMaxTrajectoriesThreshold = iConfig.getParameter<std::vector<uint> >("maxTrajectoriesThreshold");
00074   theNumberOfHitPerModuleThreshold = iConfig.getParameter<std::vector<uint> >("numberOfHitPerModuleThreshold");
00075 
00076   //could be configurable, but not
00077   theBranchonfirstlayer=true;
00078   theCarriedIPatfirstlayer=false;
00079   theCarriedIPatfirstlayerModule =true;
00080 
00081   //output track candidate selection
00082   theMinNumberOfHitOnCandidate = iConfig.getParameter<uint>("minNumberOfHitOnCandidate");
00083   
00084   //single or multiple trajectories per muon
00085   theOutputAllTraj = iConfig.getParameter<bool>("outputAllTraj");
00086 
00087   if (!theSmoother)
00088     theSmoother = new KFTrajectorySmoother(thePropagator,theUpdator,theRoadEstimator);
00089 }

MuonRoadTrajectoryBuilder::~MuonRoadTrajectoryBuilder (  ) 

Definition at line 92 of file MuonRoadTrajectoryBuilder.cc.

References theCategory, theHitEstimator, theRoadEstimator, theSmoother, and theUpdator.

00093 {
00094   edm::LogInfo(theCategory)<<"cleaning the object";
00095   if (theRoadEstimator) delete theRoadEstimator;
00096   if (theHitEstimator) delete theHitEstimator;
00097   if (theUpdator) delete theUpdator;
00098   if (theSmoother) delete theSmoother;
00099 }


Member Function Documentation

void MuonRoadTrajectoryBuilder::checkDuplicate ( TrajectoryCollection collection  )  const [private]

Definition at line 688 of file MuonRoadTrajectoryBuilder.cc.

References h1, h2, LogDebug, and theCategory.

Referenced by GatherHits().

00689 {
00690   LogDebug(theCategory)<<"checking for duplicates here. list size: "<<collection.size();
00691 
00692   //loop over the trajectory list
00693   TrajectoryCollection::iterator traj1 = collection.begin();
00694   while(traj1 != collection.end())
00695     {
00696       LogDebug(theCategory)<<"";
00697 
00698       //reloop over the trajectory list from traj1
00699       TrajectoryCollection::iterator traj2 = traj1;
00700       traj2++;//advance one more
00701       bool traj1_removed=false;
00702       while( traj2 != collection.end())
00703         {
00704           if (traj2 == traj1 ) continue; //skip itself of course
00705 
00706           //need to start from the back of the list of measurment
00707           std::list <TrajectoryMeasurement >::reverse_iterator h1 = traj1->measurements.rbegin();
00708           std::list <TrajectoryMeasurement >::reverse_iterator h2 = traj2->measurements.rbegin();
00709                   
00710           bool break_different = false;
00711           while (h1 != traj1->measurements.rend() && h2!=traj2->measurements.rend())
00712             {
00713               TransientTrackingRecHit::ConstRecHitPointer hit1 = h1->recHit();
00714               TransientTrackingRecHit::ConstRecHitPointer hit2 = h2->recHit();
00715 
00716               LogDebug(theCategory)<<"(hit1->geographicalId().rawId()) "<<(hit1->geographicalId().rawId())<<"(hit1->globalPosition()) "<<(hit1->globalPosition())
00717                                    <<"(hit2->geographicalId().rawId()) "<<(hit2->geographicalId().rawId())<<"(hit2->globalPosition()) "<<(hit2->globalPosition());
00718 
00719               if (hit1 == hit2){/*those are common hits, everything's alright so far*/ h1++;h2++; continue;}
00720               else{break_different =true;
00721                         
00722                 LogDebug(theCategory)<<"list of hits are different";
00723                         
00724                 break;}
00725             }
00726           if (!break_different) 
00727             //meaning one of the list has been exhausted
00728             //one list if the subset of the other
00729             {
00730               LogDebug(theCategory)<<"list of hits are identical/subset. remove one of them.";
00731               //there is a common subset to the two list of rechits.
00732               //remove the one with the fewer hits (iterator that reached the end first)
00733               //in case they are exactly identical (both iterator reached the end at the same time), traj2 will be removed by default
00734               if (h1 != traj1->measurements.rend())
00735                 {
00736                   LogDebug(theCategory)<<"I removed traj2";
00737                   //traj2 has been exhausted first. remove it and place the iterator on next item
00738                   traj2=collection.erase(traj2);
00739                 }
00740               else
00741                 {
00742                   LogDebug(theCategory)<<"I removed traj1. and decrement traj2";
00743                   //traj1 has been exhausted first. remove it
00744                   traj1=collection.erase(traj1);
00745                   //and set the iterator traj1 so that next++ will set it to the correct place in the list  
00746                   traj1_removed=true;
00747                   break; // break the traj2 loop, advance to next traj1 item
00748                 }
00749             }
00750           else
00751             {traj2++;   }
00752         }//loop on traj2
00753       if (!traj1_removed)
00754         {//increment only if you have remove the item at traj1
00755           traj1++;}
00756     }//loop on traj1
00757 }

bool MuonRoadTrajectoryBuilder::checkStep ( TrajectoryCollection collection  )  const [private]

Definition at line 665 of file MuonRoadTrajectoryBuilder.cc.

References theCategory, theDynamicMaxNumberOfHitPerModule, theMaxTrajectories, theMaxTrajectoriesThreshold, theNumberOfHitPerModule, theNumberOfHitPerModuleThreshold, and trajectoryOrder().

Referenced by makeTrajectories_0().

00666 {
00667   //dynamic cut on the max number of rechit allowed on a single module
00668   if (theDynamicMaxNumberOfHitPerModule) {
00669     for (uint vit = 0; vit!= theMaxTrajectoriesThreshold.size() ; vit++){
00670       if (collection.size() >theMaxTrajectoriesThreshold[vit]){
00671         theNumberOfHitPerModule= theNumberOfHitPerModuleThreshold[vit];}
00672       else
00673         break;}}
00674   
00675   //reduce the number of possible trajectories if too many
00676   if ( collection.size() > theMaxTrajectories) {
00677     //order with most hits or best chi2
00678     collection.sort(trajectoryOrder);
00679     uint prevSize=collection.size();
00680     collection.resize(theMaxTrajectories);
00681     edm::LogInfo(theCategory)
00682       <<" too many possible trajectories ("<<prevSize
00683       <<"), reduce the possibilities to "<<theMaxTrajectories<<" bests.";
00684   }
00685   return true;
00686 }

void MuonRoadTrajectoryBuilder::cleanTrajectory ( Trajectory traj  )  const [private]

Definition at line 394 of file MuonRoadTrajectoryBuilder.cc.

References GeometricSearchTracker::detLayer(), Trajectory::direction(), MeasurementTracker::geometricSearchTracker(), LogDebug, Trajectory::measurements(), Trajectory::seed(), theCategory, and theMeasurementTracker.

Referenced by smooth().

00394                                                                         {
00395    //remove the overlapping recHits since the smoother will chock on it
00396    Trajectory::DataContainer meas =traj.measurements();
00397    
00398    const DetLayer* lastDetLayer =0;
00399    Trajectory::DataContainer::iterator mit = meas.begin();
00400    while (mit!=meas.end()){
00401      {
00402        const DetLayer * detLayer = theMeasurementTracker->geometricSearchTracker()->detLayer(mit->recHit()->det()->geographicalId());
00403        LogDebug(theCategory)<<"(mit->recHit()->det()->geographicalId().rawId()) "<<(mit->recHit()->det()->geographicalId().rawId())
00404                             <<"(detLayer) "<<(detLayer)<<"(lastDetLayer) "<<(lastDetLayer);
00405 
00406        if (detLayer==lastDetLayer)
00407          {
00408            mit=meas.erase(mit); //serve as mit++ too
00409          }
00410        else {mit++;}
00411        lastDetLayer=detLayer;
00412      }
00413      Trajectory newTraj(traj.seed(),traj.direction());
00414      for (Trajectory::DataContainer::iterator mit=meas.begin();mit!=meas.end();++mit)
00415        {newTraj.push(*mit);}
00416      traj=newTraj;
00417    }
00418  }

int MuonRoadTrajectoryBuilder::GatherHits ( const TrajectoryStateOnSurface step,
const DetLayer thislayer,
TrajectoryCollectionFPair Trajectories 
) const [private]

Definition at line 459 of file MuonRoadTrajectoryBuilder.cc.

References checkDuplicate(), MuonRoadTrajectoryBuilder::trajectory::chi2, GeometricSearchDet::compatibleDets(), MuonRoadTrajectoryBuilder::trajectory::duplicate, dws, Chi2MeasurementEstimator::estimate(), MuonRoadTrajectoryBuilder::flippingPair< A >::flip(), Trajectory::foundHits(), TrajectoryStateOnSurface::freeState(), TrajectoryStateOnSurface::globalPosition(), MuonRoadTrajectoryBuilder::flippingPair< A >::head(), MeasurementTracker::idToDet(), TrajectoryStateOnSurface::isValid(), MuonRoadTrajectoryBuilder::trajectory::lastmissed, LogDebug, PV3DBase< T, PVType, FrameType >::mag(), MuonRoadTrajectoryBuilder::trajectory::measurements, MuonRoadTrajectoryBuilder::trajectory::missed, MuonRoadTrajectoryBuilder::trajectory::missedinarow, PV3DBase< T, PVType, FrameType >::perp(), Propagator::propagate(), Trajectory::push(), DetId::rawId(), MeasurementDet::recHits(), MuonRoadTrajectoryBuilder::flippingPair< A >::tail(), theBranchonfirstlayer, theCarriedIPatfirstlayer, theCarriedIPatfirstlayerModule, theCategory, theFirstlayer, theHitEstimator, theMeasurementTracker, theNumberOfHitPerModule, thePropagator, theRoadEstimator, theUpdator, MuonRoadTrajectoryBuilder::trajectory::traj, MuonRoadTrajectoryBuilder::trajectory::TSOS, and TrajectoryStateUpdator::update().

Referenced by makeTrajectories_0().

00460 {
00461   TrajectoryStateOnSurface restep;
00462   bool atleastoneadded=false;
00463   int Nhits=0;
00464 
00465   //find compatible modules
00466   std::vector<DetLayer::DetWithState>  compatible =thislayer->compatibleDets( step, *thePropagator , *theRoadEstimator);
00467   
00468   //loop over compatible modules
00469   for (std::vector< DetLayer::DetWithState > ::iterator dws = compatible.begin();dws != compatible.end();dws++)
00470     {
00471       const DetId presentdetid = dws->first->geographicalId();//get the det Id
00472       restep = dws->second;
00473 
00474 
00475         LogDebug(theCategory)<<((dws->first->components ().size()!=0) ? /*stereo layer*/"double sided layer":/*single sided*/"single sided layer")
00476                              <<"(presentdetid.rawId()) "<<(presentdetid.rawId());
00477 
00478       //get the rechits on this module
00479       TransientTrackingRecHit::ConstRecHitContainer  thoseHits = theMeasurementTracker->idToDet(presentdetid)->recHits(restep); 
00480       int additionalHits =0;
00481 
00482       LogDebug(theCategory)<<"(thoseHits.size()) "<<(thoseHits.size());
00483 
00484       if (thoseHits.size()>theNumberOfHitPerModule)
00485         { edm::LogInfo(theCategory)<<"more than "<<theNumberOfHitPerModule 
00486                                            <<" compatible hits ("<<thoseHits.size()<<")on module "<<presentdetid.rawId()
00487                                            <<", skip it";continue; }
00488 
00489       //loop over the rechit on the module
00490       for (TransientTrackingRecHit::ConstRecHitContainer::const_iterator iTThit = thoseHits.begin();iTThit != thoseHits.end(); iTThit++)
00491         {
00492           if (!(*iTThit)->isValid())/*skip*/{edm::LogInfo(theCategory)<<"rec hit not valid on module "<<presentdetid.rawId() <<". I skip it"; continue;}
00493 
00494           LogDebug(theCategory)<<((dynamic_cast<const SiStripMatchedRecHit2D *>((*iTThit)->hit())!=0) ? /*matched rechit*/ "matched rechit" : " r-phi rechit");
00495 
00496           //get the surface of the module Id
00497           const BoundPlane & surface = (*iTThit)->det()->surface();
00498 
00499           //estimate the consistency
00500           MeasurementEstimator::HitReturnType est_road = theRoadEstimator->estimate(restep,**iTThit);
00501 
00502           LogDebug(theCategory)<<"(restep.globalPosition().perp()) "<<(restep.globalPosition().perp())<<"(restep.globalPosition().mag()) "<<(restep.globalPosition().mag())
00503                              <<"road step parameters at module: \n"<<restep
00504                                << "(est_road.first) "<<(est_road.first)<<"(est_road.second) "<<(est_road.second);
00505 
00506           //check consistency
00507           if (est_road.first)
00508             { //hit and propagation are consistent : gather the hit
00509               Nhits++;
00510               additionalHits++;
00511               atleastoneadded=true;
00512               
00513               LogDebug(theCategory)<<"hit is consistent with road"<<"(presentdetid.rawId()) "<<(presentdetid.rawId())
00514                                  <<"loop over previous trajectories\n"
00515                                    <<"(Trajectories.tail().size()) "<<(Trajectories.tail().size())<<"(Trajectories.head().size()) "<<(Trajectories.head().size());
00516                 
00517               //update the list of trajectory that we have with the consistent rechit.
00518               //loop over the existing list of trajectories and add the hit if necessary
00519               for ( TrajectoryCollection::iterator traj =Trajectories.head().begin();traj != Trajectories.head().end(); traj++)
00520                 {
00521                   //what is the previous state for this trajectory
00522                   const TrajectoryStateOnSurface & previousState = traj->TSOS;
00523                   if (!previousState.isValid())
00524                     {edm::LogError(theCategory)<<"previous free state is invalid at trajectory update, this is WRONG"; continue;}
00525                   const FreeTrajectoryState & previousFreestate = *previousState.freeState();
00526                   
00527                   //propagate it to the current surface
00528                   TrajectoryStateOnSurface predictedState = thePropagator->propagate(previousFreestate,surface);
00529                   if (!predictedState.isValid())/*skip*/{edm::LogError(theCategory)
00530                         <<"predicted state is not valid at trajectory update, rechit surface cannot be reached by the previous updated state.";continue;}
00531 
00532                   MeasurementEstimator::HitReturnType est ;
00533                   est= theHitEstimator->estimate(predictedState,**iTThit);
00534 
00535                   LogDebug(theCategory)<<"(est.first) "<<(est.first)<<"(est.second) "<<(est.second);
00536 
00537                   //is the current hit consistent with the trajectory
00538                   if (est.first )
00539                     {
00540                       //update the trajectory state with the rechit
00541                       const TrajectoryStateOnSurface & updatedState = theUpdator->update(predictedState,**iTThit);
00542                       if (!updatedState.isValid())/*skip*/{edm::LogError(theCategory)<<"updated state is not valid, this is really wrong";continue;}
00543 
00544                       LogDebug(theCategory)<<"updating a previous state with a rechit";
00545 
00546                       //add a combined trajectory to the new list of trajectory, starting from the existing trajecotry
00547                       Trajectories.tail().push_back(*traj); //from existing
00548                       trajectory & combined = (*Trajectories.tail().rbegin());
00549                       combined.duplicate =false; //this is important
00550                       //increment the chi2
00551                       //combined.chi2 += est.second;
00552                       combined.chi2 += est_road.second;//better to add the road chi2 too unbias the chi2 sum towards first hits
00553                       //some history about the trajectory
00554                       combined.lastmissed=false;
00555                       combined.missedinarow=0;
00556                       //add a new hits to the measurements
00557                       combined.measurements.push_back(TrajectoryMeasurement(updatedState,*iTThit));
00558                       TrajectoryMeasurement & trajMeasurement = (*combined.measurements.rbegin());
00559                       //assigne updated state
00560                       combined.TSOS = updatedState;
00561                       //add trajectory measurement 
00562                       combined.traj.push(trajMeasurement,est.second);
00563 
00564                       LogDebug(theCategory)<<"(combined.traj.foundHits()) "<<(combined.traj.foundHits())
00565                                          <<"muon measurement on previous module: \n"<<traj->TSOS
00566                                          <<"muon measurement before update: \n"<<predictedState
00567                                          <<"muon measurement after update: \n"<<updatedState;
00568 
00569                     }//hit consistent with trajectory
00570                   else
00571                     {
00572                       LogDebug(theCategory)<<"hit failed chi2 test for trajectories update\n"<<"(traj->duplicate) "<<(traj->duplicate);
00573 
00574                       if (!traj->duplicate){
00575                         Trajectories.tail().push_back(*traj);
00576                         trajectory & copied = (*Trajectories.tail().rbegin());
00577                         copied.missed++;
00578                         copied.lastmissed=true;
00579                         copied.missedinarow++;
00580                         traj->duplicate =true; //set this trajectory to already have been copied into next step
00581                        }//not a duplicate trajectory
00582                     }//hit not consistent with trajectory
00583                 }//existing trajectories loop
00584             }//hit is consistent with muon road
00585         }//rechits on module loop
00586       
00587       
00588       //discard previous list of trajectories
00589       //if something as been done of course
00590       if (Trajectories.tail().size()!=0) 
00591         {
00592           //if this is not the first "layer" of detector, set updated trajectories as new seed trajectories
00593           //will branch on every single rechit uncountered for first "layer"
00594           if (!theFirstlayer || theBranchonfirstlayer)
00595             {
00596               LogDebug(theCategory)<<"swapping trajectory list index";
00597               
00598               //always carry on the <IP> alone state in the next list of trajectories to avoid bias from the first rechits
00599               if (theFirstlayer && theCarriedIPatfirstlayerModule)
00600                 {
00601                   LogDebug(theCategory)<<"push front <IP> to next list of trajectories";
00602 
00603                   Trajectories.tail().push_front(*Trajectories.head().begin()); //[0] is <IP> always
00604                   trajectory & pushed = *Trajectories.tail().begin();
00605                   pushed.missed+=additionalHits;
00606                   pushed.lastmissed = ( additionalHits!=0);
00607                   pushed.missedinarow++;
00608                 }
00609               //FIXME, there is a candidate leak at this point
00610               //if the IP state is carried on at first layer, without update, then it will be duplicated. this is very unlikely though
00611 
00612               Trajectories.head().clear();
00613 
00614               //swap the lists
00615               Trajectories.flip();
00616             }
00617         }//discard previous list of trajectories
00618     }//module loop
00619 
00620   
00621 
00622   //do some cleaning of the list of trajectories
00623   if(theFirstlayer && atleastoneadded )
00624     {
00625       theFirstlayer =false; //we are not in the first layer if something has been added
00626       if (!theBranchonfirstlayer)
00627         {
00628           LogDebug(theCategory)<<"swapping trajectory list index (end of first layer)";
00629 
00630           //and for consistency, you have to swap index here, because it could ahve not been done in the module loop above
00631           //always carry on the <IP> alone state in the next list of trajectories to avoid bias from the first rechits
00632           if (theCarriedIPatfirstlayer)
00633             {Trajectories.tail().push_front(*Trajectories.head().begin());} //[0] is <IP> always at this stage
00634           //FIXME, there is a candidate leak at this point
00635           //if the IP state is carried on at first layer, without update, then it will be duplicated. this is very unlikely though
00636           
00637           Trajectories.head().clear();
00638           //swap the switch
00639           Trajectories.flip();
00640         }
00641       else
00642         {
00643           //actually remove the <IP> from first postion of the next source of trajectories
00644           //since the swaping has already been done. pop up from theTrajectorysource, not !theTrajectorysource
00645           //only if it has been done at the first layer module though
00646           if (!theCarriedIPatfirstlayer && theCarriedIPatfirstlayerModule){
00647 
00648             LogDebug(theCategory)<<"pop up <IP> from trajectories";
00649 
00650             Trajectories.head().pop_front(); }
00651         }
00652 
00653 
00654       //check an remove trajectories that are subset of the other in next source
00655       //after the first layer only
00656       if (Trajectories.head().size()>=2)
00657         {checkDuplicate(Trajectories.head());}
00658 
00659     }  //do some cleaning of the list of trajectories
00660   return Nhits;
00661 
00662 }

void MuonRoadTrajectoryBuilder::makeTrajectories ( const TrajectorySeed seed,
std::vector< Trajectory > &  result,
int  version = 0 
) const [private]

Definition at line 143 of file MuonRoadTrajectoryBuilder.cc.

References makeTrajectories_0(), and makeTrajectories_1().

Referenced by trajectories().

00144 {  if (version==0) { makeTrajectories_0(seed,result);}
00145   else if (version==1) { makeTrajectories_1(seed,result);}}

void MuonRoadTrajectoryBuilder::makeTrajectories_0 ( const TrajectorySeed seed,
std::vector< Trajectory > &  result 
) const [private]

Definition at line 150 of file MuonRoadTrajectoryBuilder.cc.

References alongMomentum, checkStep(), PTrajectoryStateOnDet::detId(), detId, TrajectoryStateOnSurface::freeState(), GatherHits(), MeasurementTracker::geometricSearchTracker(), MeasurementTracker::geomTracker(), TrajectoryStateOnSurface::globalMomentum(), TrajectoryStateOnSurface::globalPosition(), MuonRoadTrajectoryBuilder::flippingPair< A >::head(), TrackingGeometry::idToDet(), SimpleDiskBounds::innerRadius(), TrajectoryStateOnSurface::isValid(), LogDebug, MuonRoadTrajectoryBuilder::trajectory::measurements, GeometricSearchTracker::negTecLayers(), GeometricSearchTracker::negTidLayers(), SimpleDiskBounds::outerRadius(), PV3DBase< T, PVType, FrameType >::perp(), GeometricSearchTracker::posTecLayers(), GeometricSearchTracker::posTidLayers(), Propagator::propagate(), r, DetId::rawId(), smooth(), TrajectorySeed::startingState(), DetId::subdetId(), GeomDet::surface(), GeomDetEnumerators::TEC, theCategory, theField, theFirstlayer, theMeasurementTracker, theMinNumberOfHitOnCandidate, theNumberOfHitPerModule, theNumberOfHitPerModuleDefault, theOutputAllTraj, thePropagator, theTransformer, GeomDetEnumerators::TIB, GeometricSearchTracker::tibLayers(), GeomDetEnumerators::TID, GeomDetEnumerators::TOB, GeometricSearchTracker::tobLayers(), MuonRoadTrajectoryBuilder::trajectory::traj, trajectoryOrder(), TrajectoryStateTransform::transientState(), MuonRoadTrajectoryBuilder::trajectory::TSOS, PV3DBase< T, PVType, FrameType >::z(), and z.

Referenced by makeTrajectories().

00151 {
00152   Trajectory basicTrajectory(seed,alongMomentum);
00153   //add the muon system measurement to the basicTrajectory
00154   //...no yet implemented...
00155 
00156   //get the initial state
00157   PTrajectoryStateOnDet   PTstart=seed.startingState();
00158   DetId detId(PTstart.detId());
00159   const BoundPlane * surface =(&theMeasurementTracker->geomTracker()->idToDet(detId)->surface());
00160   //start from this point
00161   TrajectoryStateOnSurface TSOS = theTransformer.transientState(PTstart,surface,theField);
00162   if (!TSOS.isValid())/*/abort*/{ edm::LogError(theCategory)<<"TSOS from PTSOD is not valid.";return ;}
00163   
00164   LogDebug(theCategory) <<"(detId.rawId()) "<<(detId.rawId())<<"(detId.subdetId()) "<<(detId.subdetId())
00165                         <<"(TSOS.globalPosition()) "<<(TSOS.globalPosition())
00166                         <<"(TSOS.globalMomentum()) "<<(TSOS.globalMomentum());
00167  
00168   //initialization
00169   //----------------------
00170   //  WARNING. this is mutable 
00171   //  you should never remove this line
00172   theFirstlayer=true;
00173   theNumberOfHitPerModule = theNumberOfHitPerModuleDefault;
00174   //----------------------
00175   int Nhits=0;
00176   GlobalPoint position;
00177   double z=0,r=0;
00178   //flipping pair of list of trajectories
00179   TrajectoryCollectionFPair Trajectories; 
00180   //initialize the head() of pair of list of trajectories
00181   Trajectories.head().push_back(trajectory());
00182   trajectory & initial = *Trajectories.head().rbegin();
00183   initial.TSOS=TSOS;  
00184   initial.traj=basicTrajectory;      
00185   
00186 
00187 
00188   //get the DetLayer in the tracker
00189   std::vector<BarrelDetLayer*> tiblc = theMeasurementTracker->geometricSearchTracker()->tibLayers();
00190   std::vector<BarrelDetLayer*> toblc = theMeasurementTracker->geometricSearchTracker()->tobLayers();
00191   std::vector<ForwardDetLayer*> tidlc[2];
00192   tidlc[0]=theMeasurementTracker->geometricSearchTracker()->negTidLayers();
00193   tidlc[1]=theMeasurementTracker->geometricSearchTracker()->posTidLayers();
00194   std::vector<ForwardDetLayer*> teclc[2];
00195   teclc[0]=theMeasurementTracker->geometricSearchTracker()->negTecLayers();
00196   teclc[1]=theMeasurementTracker->geometricSearchTracker()->posTecLayers();
00197   const int Ntib=tiblc.size();
00198   const int Ntob=toblc.size();
00199   const int Ntid=tidlc[0].size();
00200 
00201 
00202   const int Ntec=teclc[0].size();
00203 
00204   LogDebug(theCategory)<<"(Ntib) "<<(Ntib)<<"(Ntob) "<<(Ntob)<<"(Ntid) "<<(Ntid)<<"(Ntec) "<<(Ntec);
00205 
00206   const SimpleDiskBounds * sdbounds=0;
00207 
00208   position = TSOS.globalPosition();
00209   z = position.z();
00210   r = position.perp();
00211 
00212   //select which part we are in
00213   enum PART { fault , PXB, PXF, TIB , TID , TOB , TEC};
00214   PART whichpart = fault;
00215   switch(detId.subdetId()){
00216   case 1: {whichpart=PXB;break;}
00217   case 2: {whichpart=PXF;break;}
00218 
00219   case 3: {whichpart=TIB;break;}
00220   case 4: {whichpart=TID;break;}
00221   case 5: {whichpart=TOB;break;}
00222   case 6: {whichpart=TEC;break;}}
00223 
00224   bool inapart=true;
00225   bool firstRound =true;
00226   int indexinpart=0;
00227   //loop while in a valid part of the tracker
00228   while(inapart){
00229 
00230       //check on the trajectory list and stuff
00231       if (!checkStep(Trajectories.head())) break;
00232       //................
00233 
00234     switch (whichpart){
00235 
00236     case fault: /*abort*/ {edm::LogError(theCategory)<<"something's wrong with the seed";return;}
00237     case PXB: /*abort*/ {edm::LogError(theCategory)<<"PXB no yet implemented";return;}
00238     case PXF: /*abort*/ {edm::LogError(theCategory)<<"PXF no yet implemented";return;}
00239         
00240       //-------------- into TIB----------------
00241     case TIB:{
00242       if (indexinpart==Ntib){/*you have reach the last layer of the TIB.let's go to the TOB*/whichpart = TOB; indexinpart=-1;break; }
00243 
00244       LogDebug(theCategory)<<"within TIB "<<indexinpart+1;
00245         
00246       //propagate to corresponding surface
00247       if (!firstRound) TSOS = thePropagator->propagate(*TSOS.freeState(),tiblc[indexinpart]->surface());
00248       if (!TSOS.isValid()) {;break;} //go to the next one 
00249             
00250       z=TSOS.globalPosition().z();
00251 
00252       //have we reached a boundary
00253       if (fabs(z) > fabs(tidlc[(z>0)][0]->surface().position().z())) 
00254         {/*z bigger than the TID min z: go to TID*/
00255           LogDebug(theCategory)<<"|z| ("<<z<<") bigger than the TID min z("<<tidlc[(z>0)][0]->surface().position().z()<<"): go to TID";
00256           whichpart = TID; indexinpart=-1; break;}
00257       else  {/*gather hits in the corresponding TIB layer*/ Nhits+=GatherHits(TSOS,tiblc[indexinpart],Trajectories);}
00258       break;}
00259 
00260       //-------------- into TID----------------
00261     case TID: {
00262       if (indexinpart==Ntid){/*you have reach the last layer of the TID. let's go to the TEC */ whichpart = TEC; indexinpart=-1; break;}
00263 
00264       LogDebug(theCategory)<<"within TID "<<indexinpart+1;
00265 
00266       //propagate to corresponding surface
00267       if (!firstRound) TSOS = thePropagator->propagate(*TSOS.freeState(),tidlc[(z>0)][indexinpart]->surface());
00268       if (!TSOS.isValid()){break;}//go to the next one 
00269           
00270       position =  TSOS.globalPosition();
00271       z = position.z();
00272       r = position.perp();
00273 
00274       sdbounds = dynamic_cast<const SimpleDiskBounds *>(&tidlc[(z>0)][indexinpart]->surface().bounds());
00275       if (!sdbounds)/*abort*/{edm::LogError(theCategory)<<" detlayer bounds are not SimpleDiskBounds in tid geometry";return;}
00276         
00277       //have we reached a boundary
00278       if (r < sdbounds->innerRadius())
00279         {/*radius smaller than the TID disk inner radius: next disk please*/
00280           LogDebug(theCategory)<<"radius ("<<r<<") smaller than the TID disk inner radius ("<<sdbounds->innerRadius()<<"): next disk please";
00281           break;}
00282       else if (r >sdbounds->outerRadius())
00283         {/*radius bigger than the TID disk outer radius: go to TOB*/
00284           LogDebug(theCategory)<<"radius ("<<r<<") bigger than the TID disk outer radius("<<sdbounds->outerRadius()<<"): go to TOB";
00285           whichpart = TOB; indexinpart=-1;break;}
00286       else  {/*gather hits in the corresponding TIB layer*/
00287         LogDebug(theCategory)<<"collecting hits";
00288         Nhits+=GatherHits(TSOS,tidlc[(z>0)][indexinpart],Trajectories);}
00289       break;}
00290 
00291       //-------------- into TOB----------------
00292     case TOB: {
00293       if (indexinpart==Ntob){/*you have reach the last layer of the TOB. this is an end*/ inapart=false;break;}
00294 
00295       LogDebug(theCategory)<<"within TOB "<<indexinpart+1;
00296         
00297       //propagate to corresponding surface
00298       if (!firstRound) TSOS = thePropagator->propagate(*TSOS.freeState(),toblc[indexinpart]->surface());
00299       if (!TSOS.isValid())  {break;} //go to the next one 
00300             
00301       z =  TSOS.globalPosition().z();
00302         
00303       //have we reached a boundary
00304       if (fabs(z) > fabs(teclc[(z>0)][0]->surface().position().z()))
00305         {/*z bigger than the TOB layer max z: go to TEC*/
00306           LogDebug(theCategory)<<"|z| ("<<z<<") bigger than the TOB layer max z ("<< teclc[(z>0)][0]->surface().position().z()<<"): go to TEC";
00307           whichpart = TEC; indexinpart=-1;break;}
00308       else {/*gather hits in the corresponding TOB layer*/Nhits+=GatherHits(TSOS,toblc[indexinpart],Trajectories);}
00309       break;}
00310 
00311       //-------------- into TEC----------------
00312     case TEC:   {
00313       if (indexinpart==Ntec){/*you have reach the last layer of the TEC. let's end here*/inapart=false;break;}
00314           
00315       LogDebug(theCategory)<<"within TEC "<<indexinpart+1;
00316           
00317       //propagate to corresponding TEC disk
00318       if (!firstRound) TSOS = thePropagator->propagate(*TSOS.freeState(),teclc[(z>0)][indexinpart]->surface());
00319       if (!TSOS.isValid()) {break;} //go to the next one
00320           
00321       position = TSOS.globalPosition();
00322       z = position.z();
00323       r = position.perp();
00324           
00325       sdbounds = dynamic_cast<const SimpleDiskBounds *>(&teclc[(z>0)][indexinpart]->surface().bounds());
00326       if (!sdbounds)/*abort*/ {edm::LogError(theCategory)<<" detlayer bounds are not SimpleDiskBounds in tec geometry";return;}
00327           
00328       //have we reached a boundary ?
00329       if (r < sdbounds->innerRadius())
00330         {/*radius smaller than the TEC disk inner radius: next disk please*/
00331           LogDebug(theCategory)<<"radius ("<<r<<") smaller than the TEC disk inner radius ("<<sdbounds->innerRadius()<<"): next disk please";
00332           break;}
00333       else if (r > sdbounds->outerRadius())
00334         {/*radius bigger than the TEC disk outer radius: I can stop here*/
00335           LogDebug(theCategory)<<"radius ("<<r<<") bigger than the TEC disk outer radius ("<<sdbounds->outerRadius()<<"): I can stop here";
00336           inapart=false;break;}
00337       else {/*gather hits in the corresponding TEC layer*/Nhits+=GatherHits(TSOS,teclc[(z>0)][indexinpart],Trajectories);}
00338           
00339       break;}
00340 
00341     }//switch
00342     indexinpart++;
00343     firstRound=false;
00344   }//while inapart
00345 
00346 
00347   LogDebug(theCategory)<<"propagating through layers is done";
00348   
00349   //--------------------------------------- SWIMMING DONE --------------------------------------
00350   //the list of trajectory has been build. let's find out which one is the best to use.
00351   
00352   edm::LogInfo(theCategory)<<"found: "
00353                                       <<Nhits<<" hits in the road for this seed \n"
00354                                       << Trajectories.head().size()<<" possible trajectory(ies)";
00355   
00356   if (Trajectories.head().size() == 0) /*abort*/{edm::LogError(theCategory)<<" no possible trajectory found"; return;}
00357   
00358   //order the list to put the best in front
00359   Trajectories.head().sort(trajectoryOrder);
00360   
00361   //------------------------------------OUTPUT FILL---------------------------------------------
00362   if (theOutputAllTraj) {
00363     //output all the possible trajectories found, if they have enough hits on them
00364     //the best is still the first
00365     for (TrajectoryCollection::iterator tit = Trajectories.head().begin(); tit!=Trajectories.head().end();tit++)
00366       {if (tit->measurements.size()>= theMinNumberOfHitOnCandidate){result.push_back(smooth(tit->traj));}}
00367   }
00368   else{
00369     //output only the best one
00370     trajectory & best = (*Trajectories.head().begin());
00371     if (best.measurements.size()< theMinNumberOfHitOnCandidate)/*abort*/{edm::LogError(theCategory)<<"best trajectory does not have enough ("<<best.measurements.size()<<") hits on it (<"<<theMinNumberOfHitOnCandidate<<")"; return;}
00372     //output only the best trajectory
00373     result.push_back(smooth(best.traj));}
00374   
00375   edm::LogInfo(theCategory)<<result.size()<<" trajectory(ies) output";
00376 }//makeTrajectories_0

void MuonRoadTrajectoryBuilder::makeTrajectories_1 ( const TrajectorySeed seed,
std::vector< Trajectory > &  result 
) const [private]

Definition at line 762 of file MuonRoadTrajectoryBuilder.cc.

References alongMomentum.

Referenced by makeTrajectories().

00763 {
00764   Trajectory basicTrajectory(seed,alongMomentum);
00765   //add the muon system measurement to the basicTrajectory
00766   //...
00767 
00768 //   //build the trajectories
00769 //   std::vector<Trajectory> unsmoothed = theCkfbuilder->trajectories(seed);
00770   
00771 //   //smoothed them
00772 //   if (theOutputAllTraj) {
00773 //     for (std::vector<Trajectory>::iterator tit = unsmoothed.begin(); tit!=unsmoothed.end();tit++)
00774 //       {result.push_back(smooth(*tit));}
00775 //   }
00776 //   else{
00777 //     //output only the first one
00778 //     result.push_back(smooth(unsmoothed.front()));} 
00779     
00780 }

void MuonRoadTrajectoryBuilder::setEvent ( const edm::Event iEvent  )  const [virtual]

Implements TrajectoryBuilder.

Definition at line 101 of file MuonRoadTrajectoryBuilder.cc.

References theMeasurementTracker, and MeasurementTracker::update().

00101                                                                       {
00102   theMeasurementTracker->update(iEvent);
00103 }

Trajectory MuonRoadTrajectoryBuilder::smooth ( Trajectory traj  )  const [private]

Definition at line 440 of file MuonRoadTrajectoryBuilder.cc.

References cleanTrajectory(), sortTrajectoryMeasurements(), theCategory, theSmoother, and KFTrajectorySmoother::trajectories().

Referenced by makeTrajectories_0().

00440                                                                     {
00441   
00442   //need to order the list of measurements on the trajectory first
00443   sortTrajectoryMeasurements(traj);
00444 
00445   std::vector<Trajectory> ret=theSmoother->trajectories(traj);
00446 
00447   if (ret.empty()){
00448     edm::LogError(theCategory)<<"smoother returns an empty vector of trajectories: try cleaning first and resmooth";
00449     cleanTrajectory(traj);
00450     ret=theSmoother->trajectories(traj);
00451   }
00452   
00453   if (ret.empty()){edm::LogError(theCategory)<<"smoother returns an empty vector of trajectories.";
00454     return traj;}
00455   else{return (ret.front());}
00456 }

void MuonRoadTrajectoryBuilder::trajectories ( const TrajectorySeed seed,
TrajectoryContainer ret 
) const

process the seed, in a faster manner.

Definition at line 119 of file MuonRoadTrajectoryBuilder.cc.

References LogDebug, makeTrajectories(), and theCategory.

00120 {
00121   LogDebug(theCategory)<<"makeTrajectories START";
00122   //process the seed through the tracker
00123   makeTrajectories(seed,ret);
00124 }

std::vector< Trajectory > MuonRoadTrajectoryBuilder::trajectories ( const TrajectorySeed seed  )  const [virtual]

Implements TrajectoryBuilder.

Definition at line 127 of file MuonRoadTrajectoryBuilder.cc.

References LogDebug, makeTrajectories(), HLT_VtxMuL3::result, and theCategory.

00128 {
00129   LogDebug(theCategory)<<"makeTrajectories START";
00130   
00131   //default output
00132   std::vector<Trajectory> result;
00133   
00134   //process the seed through the tracker
00135   makeTrajectories(seed,result);
00136   
00137   //output the result of regional tracking
00138   return result;
00139 }


Member Data Documentation

bool MuonRoadTrajectoryBuilder::theBranchonfirstlayer [private]

Definition at line 142 of file MuonRoadTrajectoryBuilder.h.

Referenced by GatherHits(), and MuonRoadTrajectoryBuilder().

bool MuonRoadTrajectoryBuilder::theCarriedIPatfirstlayer [private]

Definition at line 143 of file MuonRoadTrajectoryBuilder.h.

Referenced by GatherHits(), and MuonRoadTrajectoryBuilder().

bool MuonRoadTrajectoryBuilder::theCarriedIPatfirstlayerModule [private]

Definition at line 144 of file MuonRoadTrajectoryBuilder.h.

Referenced by GatherHits(), and MuonRoadTrajectoryBuilder().

std::string MuonRoadTrajectoryBuilder::theCategory [private]

Info/Debug category "Muon|RecoMuon|MuonRoadTrajectoryBuilder".

Definition at line 75 of file MuonRoadTrajectoryBuilder.h.

Referenced by checkDuplicate(), checkStep(), cleanTrajectory(), GatherHits(), makeTrajectories_0(), MuonRoadTrajectoryBuilder(), smooth(), trajectories(), and ~MuonRoadTrajectoryBuilder().

bool MuonRoadTrajectoryBuilder::theDynamicMaxNumberOfHitPerModule [private]

Definition at line 135 of file MuonRoadTrajectoryBuilder.h.

Referenced by checkStep(), and MuonRoadTrajectoryBuilder().

const MagneticField* MuonRoadTrajectoryBuilder::theField [private]

Definition at line 171 of file MuonRoadTrajectoryBuilder.h.

Referenced by makeTrajectories_0(), and MuonRoadTrajectoryBuilder().

bool MuonRoadTrajectoryBuilder::theFirstlayer [mutable, private]

Definition at line 126 of file MuonRoadTrajectoryBuilder.h.

Referenced by GatherHits(), and makeTrajectories_0().

Chi2MeasurementEstimator* MuonRoadTrajectoryBuilder::theHitEstimator [private]

Definition at line 161 of file MuonRoadTrajectoryBuilder.h.

Referenced by GatherHits(), MuonRoadTrajectoryBuilder(), and ~MuonRoadTrajectoryBuilder().

uint MuonRoadTrajectoryBuilder::theMaxTrajectories [private]

Definition at line 129 of file MuonRoadTrajectoryBuilder.h.

Referenced by checkStep(), and MuonRoadTrajectoryBuilder().

std::vector<uint> MuonRoadTrajectoryBuilder::theMaxTrajectoriesThreshold [private]

Definition at line 138 of file MuonRoadTrajectoryBuilder.h.

Referenced by checkStep(), and MuonRoadTrajectoryBuilder().

const MeasurementTracker* MuonRoadTrajectoryBuilder::theMeasurementTracker [private]

Definition at line 155 of file MuonRoadTrajectoryBuilder.h.

Referenced by cleanTrajectory(), GatherHits(), makeTrajectories_0(), MuonRoadTrajectoryBuilder(), and setEvent().

unsigned int MuonRoadTrajectoryBuilder::theMinNumberOfHitOnCandidate [private]

Definition at line 148 of file MuonRoadTrajectoryBuilder.h.

Referenced by makeTrajectories_0(), and MuonRoadTrajectoryBuilder().

uint MuonRoadTrajectoryBuilder::theNumberOfHitPerModule [mutable, private]

Definition at line 137 of file MuonRoadTrajectoryBuilder.h.

Referenced by checkStep(), GatherHits(), and makeTrajectories_0().

uint MuonRoadTrajectoryBuilder::theNumberOfHitPerModuleDefault [private]

Definition at line 136 of file MuonRoadTrajectoryBuilder.h.

Referenced by makeTrajectories_0(), and MuonRoadTrajectoryBuilder().

std::vector<uint> MuonRoadTrajectoryBuilder::theNumberOfHitPerModuleThreshold [private]

Definition at line 139 of file MuonRoadTrajectoryBuilder.h.

Referenced by checkStep(), and MuonRoadTrajectoryBuilder().

bool MuonRoadTrajectoryBuilder::theOutputAllTraj [private]

Definition at line 150 of file MuonRoadTrajectoryBuilder.h.

Referenced by makeTrajectories_0(), and MuonRoadTrajectoryBuilder().

const Propagator* MuonRoadTrajectoryBuilder::thePropagator [private]

Definition at line 174 of file MuonRoadTrajectoryBuilder.h.

Referenced by GatherHits(), makeTrajectories_0(), and MuonRoadTrajectoryBuilder().

Chi2MeasurementEstimator* MuonRoadTrajectoryBuilder::theRoadEstimator [private]

Definition at line 159 of file MuonRoadTrajectoryBuilder.h.

Referenced by GatherHits(), MuonRoadTrajectoryBuilder(), and ~MuonRoadTrajectoryBuilder().

KFTrajectorySmoother* MuonRoadTrajectoryBuilder::theSmoother [private]

Definition at line 165 of file MuonRoadTrajectoryBuilder.h.

Referenced by MuonRoadTrajectoryBuilder(), smooth(), and ~MuonRoadTrajectoryBuilder().

TrajectoryStateTransform MuonRoadTrajectoryBuilder::theTransformer [private]

Definition at line 168 of file MuonRoadTrajectoryBuilder.h.

Referenced by makeTrajectories_0().

TrajectoryStateUpdator* MuonRoadTrajectoryBuilder::theUpdator [private]

Definition at line 163 of file MuonRoadTrajectoryBuilder.h.

Referenced by GatherHits(), MuonRoadTrajectoryBuilder(), and ~MuonRoadTrajectoryBuilder().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:28:47 2009 for CMSSW by  doxygen 1.5.4