Luca Lista
Software di ricostruzione OO in BaBar
Software di ricostruzione OO in BaBar
Luca Lista
INFN, Sezione di Napoli
II Workshop sul Software e Calcolo moderno,
Perugia, 15-17 giugno 1998
Luca Lista
Condizioni di lavoro Condizioni di lavoro
• BABAR comincerà la presa dati tra meno di un anno
• Alta statistica– 2 kHz al trigger di livello 1
– 50 Mbyte/sec alla farm di livello 3
– circa 100 Hz (2.5Mbyte/sec) di frequenza di registrazione di eventi
– 109 eventi/anno (25Tbyte/anno di raw data)
• Affidabilità– Il riprocessamento deve essere molto
raro
• Mantenibilità– più di 10 anni di vita per il software
– sviluppo distribuito in Europa e America
Luca Lista
Fortran e C++ in BaBarFortran e C++ in BaBar200k
400k
600k
800k
Luca Lista
Crescita del software di BaBarCrescita del software di BaBar
Luca Lista
Fortran vs C++Fortran vs C++
Luca Lista
Uso di software Uso di software standardstandard
• CLHEP– manipolazione di vettori e matrici– geometria nello spazio– algebra di Lorentz
• HepTuple– ennuple e istogrammi
• Standard C++ Library ?
• Software commerciale: – Tools.h++
• liste, container e iteratori, manipolazione di stringhe di caratteri, persistenza, ...
– Data Base
Luca Lista
Struttura del software di BStruttura del software di BAABBARAR
Simulazione VeloceGeant4
Simulazione VeloceGeant4
Simulazione Completabbsim
Simulazione Completabbsim
Simulazione CompletaGeant4
Simulazione CompletaGeant4
InterfacciaBeta
InterfacciaBeta
DigitizzazioneDigitizzazione
RicostruzioneRicostruzioneBABARBABAR
AnalisiAnalisi
F77F77
C++C++
Luca Lista
Oggetti della ricostruzioneOggetti della ricostruzione
• Gli oggetti e le loro collaborazioni costituiscono un modello dell’insieme degli elementi che intervengono nella ricostruzione:– informazioni ricostruite: rappresentano
l’output e l’input dei vari passi della ricostruzione
• hit, tracce, cluster, particelle, informazioni sul PID, ...
– modelli ausiliari al problema• elementi di rivelatore, traiettorie, …
– algoritmi: creatori e manipolatori altri oggetti
• cluster finder, track fitter, converter transiente persistente...
• molti algoritmi di ricostruzione sono incapsulati in oggetti (moduli)
Luca Lista
Il modello del rivelatoreIl modello del rivelatore
IfrGeom
Ifr
IfrBarrelSector
IfrPlanarSector
IfrBarrelView
IfrView
IfrBwdCapSector
IfrCylindricalSector
IfrDetLeaf
IfrEndCapView
IfrFecIteratorIfrFwdCapSector
IfrInnerSector
IfrInnerView
IfrLayer
IfrLayerIterator
IfrSectorIterator
IfrViewIterator
-_components
1..*
1
IfrDetComposite
1
#_parent
0..1 -_component
0..1 1
1
IfrDetIterator
1
0..1
-_iterator
0..1
IfrSector IfrFec
#_coil
0..1
IfrCoil
1
#_ifrSpecialIron0..1
IfrSpecialIron
1
#_geom0..1
1IfrDetector
0..1
1
0..1
1
0..1
IfrMaterial
1IfrGIfr
0..1
1
0..1
1
IfrDetComponent
10..1
0..1 1
1..*
1
Luca Lista
Detector Model & Event DisplayDetector Model & Event Display
Luca Lista
L’oggetto modulo: L’oggetto modulo: incapsulare un algoritmoincapsulare un algoritmo
IfrStripfrStrip
MakeIfrClustersMakeIfrClusters
IfrClusterIfrCluster
EmcClusterEmcCluster
MakeNeutralHadMakeNeutralHad
NeutralHadronNeutralHadron
• I moduli hanno come input un insieme di oggetti e producono altri oggetti come output
Luca Lista
Moduli e FrameworkModuli e Framework
• I moduli sono animati dal Framework in maniera flessibile
• supporto per l’I/O• interfaccia interattiva (Tcl, Tk)
void begin (AppJob*); AbsEvent* event (AbsEvent*); void end (AppJob*); void abort (AppJob*); void help ();
• E’ possibile passare parametri a ciascun modulo attraverso uno script Tcl
• Una sequenza può essere interrotta per passare all’evento successivo
Luca Lista
Sequenze nella ricostruzioneSequenze nella ricostruzione
SvtSequence SvtInitSequence SvtBuildEnv SvtSimSequence SvtMakeDigis SvtRemapDigis SvtRecoSequence SvtHitReco SvtTrackFinder SvtFillGTrack SvtTracksTest SvtHist
DchSequence DchInitSequence
DchSimSequence MakePointers DchMakeDigi DchRecoSequence DchMakeHits DchTrackFinder DchHist
TrkSequence TrkInitSequence TrkSimSequence TrkRecoSequence DcxTrackFinder TrkKillDch TrackMerge KalFit TrkKillKal
TrkMassFitter TrkGTrkMatch DchMakePid TrkQASvt TrkQADch TrkQAMerge
EmcSequence EmcInitSequence EmcSimSequence EmcFastGHitsToDigis EmcRecoSequence EmcMake2dCluster EmcMakeBump EmcTrackMatch
EmcPidSequence EmcIdentify EmcHist EmcPidHist
IfrSequence IfrInitSequence
IfrBuildEnv IfrRndmInit MakeXReference BBGeomRead IfrGeomInit IfrVstModule
IfrSimSequence IfrGHitToStrip IfrNoise IfrStripSort IfrMakeDigiTime IfrRecoSequence IfrStripToLayer IfrTimePointers IfrMake2DClusters IfrMake3DClusters IfrAnalSequence IfrNtuple IfrTimeHisto IfrTest
IfrPidSequence SwmTrkMaker IfrTrackMatch IfrMake3DComposites IfrDiscrModule IfrDiscrNtuple
DrcSequence DrcInitSequence DrcBuildEnv DrcBuildGeom DrcSimSequence DrcMakeDigis DrcRecoSequence DrcMakeTracks DrcMakeRecoHits DrcAssociate DrcIdentify DrcPrint DrcHist
Luca Lista
Framework: moduli e sequenzeFramework: moduli e sequenze
AppSequenceAppModule
AppExecutable AppFramework
1..n
TclFramework
MakeIfrClusters
MakeNeutralHad
AbsEvent
1..n
Luca Lista
Evoluzione del disegnoEvoluzione del disegno
AnalysisAnalysis
DesignDesignProductionProduction
TestingTesting
RequirementsRequirements
Un prodotto completo è disponibile solo alla fine
Un prototipo funzionante è disponibile sin dall’inizio
AnalysisAnalysis
DesignDesign
ProductionProduction
TestingTesting
RequirementsRequirements
Waterfall Evolutionary
Luca Lista
Evoluzione del disegnoEvoluzione del disegno
• BaBar ha avuto molto presto una catena simrecanalisi
• Modificare una parte del disegno (spesso...) non induce stravolgimenti drammatici ovunque
• Studiare le dipendenze all’interno del codice è un compito fondamentale per riconoscere i punti più deboli del design– Rational Rose
– Uso delle metriche
• Il codice di BaBar non è perfetto, ma contributi più fortran-like tendono a essere limitati in aree ben definite– Gli sviluppatori dei sottosistemi stanno
diventando sempre più competenti…!
Luca Lista
Accesso ai dati di un eventoAccesso ai dati di un evento
• La soluzione più semplice è la seguente:
AbsEvent* event;MyObject *myObject =
event->getMyObject();
•Esempio:
HepAList<GTrack> *gTrackList = event->getGTrackAList();
• Tutti i moduli della ricostruzione dipende dalla classe AbsEvent, quindi gran parte della ricostruzione dipende da HepAList<GTrack>
• In pratica, tutta la ricostruzione dipenderebbe da tutti gli oggetti di un evento
Luca Lista
Proxy DictionaryProxy Dictionary
• L’indipendenza dell’evento dalle classi-dati avviene con un meccanismo di proxy-dictionary:
MyObject *myObject = Ifd<MyObject>::get(event);
• Esempio:
HepAList<GTrack> *gTrackList = Ifd<HepAList<GTrack> > ::get(event [, key]);
• nasconde il problema dell’I/O (file sequenziale o database OO) e lo separa dallo sviluppo delle classi dei dati
Luca Lista
Clustering nell’IFRClustering nell’IFR
• L’IFR identifica , e K0L
• L’informazione ricostruita nell’IFR si presenta nella forma di cluster di strip “vicine” nello spazio
cluster cluster
Luca Lista
Cluster in 2 e 3 dimensioniCluster in 2 e 3 dimensioni
• E’ naturale pensare ad una ricostruzione prima in 2D, poi in 3D, siccome la geometria è proiettiva.
Ifr2DCluster
Luca Lista
Primo design a oggettiPrimo design a oggetti
• Come si traduce in oggetti:
Ifr3DCluster Ifr2DCluster21 Ifr1DCluster1 1..n
• Come si presenta l’interfaccia
Ifr2DCluster
numberOfHits () : intnumberOfStrips () : intfirstLayer () : intlastLayer () : inthitLayer () : int
Ifr3DCluster
centerOfGravity () : PointcovMatrix () : BbrErrordirection (from : Point) : VectornumberOfHits () : intnumberOfStrips () : intfirstLayer () : intlastLayer () : inthitLayers () : int
21
Ifr1DCluster
numberOfStrips( )
1
1..n
Luca Lista
Cluster compositiCluster compositi
• E’ necessario poter trattare cluster compositi da segmenti in diversi settori
Ifr3DCluster
centerOfGravity () : PointcovMatrix () : BbrErrordirection (from : Point) : VectornumberOfHits () : intnumberOfStrips () : intfirstLayer () : intlastLayer () : inthitLayers () : int
Ifr3DComposite
centerOfGravity () : PointcovMatrix () : BbrErrordirection (from : Point) : VectornumberOfHits () : intnumberOfStrips () : intfirstLayer () : intlastLayer () : inthitLayers () : int
1..n
Luca Lista
Cluster astratti e polimorfismoCluster astratti e polimorfismo
• E’ desiderabile che l’utente non distingua tra cluster singoli o compositi
Ifr3DCluster
centerOfGravity () : PointcovMatrix () : BbrErrordirection (from : Point) : VectornumberOfHits () : intnumberOfStrips () : intfirstLayer () : intlastLayer () : inthitLayers () : int
IfrAbs3D
centerOfGravity () : PointcovMatrix () : BbrErrordirection (from : Point) : VectornumberOfHits () : intnumberOfStrips () : intfirstLayer () : intlastLayer () : inthitLayers () : int
Ifr3DComposite
centerOfGravity () : PointcovMatrix () : BbrErrordirection (from : Point) : VectornumberOfHits () : intnumberOfStrips () : intfirstLayer () : intlastLayer () : inthitLayers () : int
1..n
Luca Lista
Evoluzione del modelloEvoluzione del modello
• Estensione dell’interfaccia ad ogni richiesta di una nuova funzionalità?
• Estensione a nuovi tipi di cluster?
IfrAbs3D
IfrAbs3D () : IfrAbs3DIfrAbs3D (a : const IfrAbs3D&) : IfrAbs3Dposition () : HepPoint~IfrAbs3D ()numberOfDigis () : intnumberOfStrips () : intcovMatrix () : BbrErrorpolCovMatrix () : BbrError$polCovMatrix ( : BbrError&, : HepPoint&) : BbrErrorfirstLayer () : intlastLayer () : inthitLayers () : inthitLayersI () : inthitsInLayer (n : int) : intstripsInLayer (n : int) : intmaxMissed () : intsectionCode () : Ifr::SectionCodecomponent ( : int = 0) : Ifr3DCluster*numberOfComponents () : intnumberOfComponents ( : Ifr::SectorCode) : intnumberOfComponents ( : Ifr::SectionCode) : intgetComposite () : Ifr3DComposite*hasBarrel () : boolhasEndCap () : boolhasFwdCap () : boolhasBwdCap () : boolhasInner () : booloperator == ( : const IfrAbs3D&) : boolnumber () : unsigned int$resetCounter () : voidsaveGuts ( : RWvostream&) : voidrestoreGuts ( : RWvistream&) : void
Ifr3DComposite Ifr3DCluster1..n
Luca Lista
Uso del visitor patternUso del visitor pattern
• L’estensione delle funzionalità non richiede modifica dell’interfaccia
Ifr3DCluster
accept (IfrClusterVisitor<T>) : T
Ifr2DCluster
accept (IfrClusterVisitor<T>) : T
2
IfrAbs3D
accept (IfrClusterVisitor<T>) : T
Ifr3DComposite
accept (IfrClusterVisitor<T>) : T
1..n
IfrClusterVisitor
operate (Ifr3DCluster*) : Toperate (Ifr3DComposite*) : Toperate (Ifr2DCluster*) : T
T Ifr3DComposite:: accept(IfrClusterVisitor<T>& v){ return v.operate(this);}
T Ifr3DCluster:: accept(IfrClusterVisitor<T>& v){ return v.operate(this);}
T Ifr2DCluster:: accept(IfrClusterVisitor<T>& v){ return v.operate(this);}
IfrVstNumberOfStrips
operate (Ifr3DCluster*) : intoperate (Ifr3DComposite*) : intoperate (Ifr2DCluster*) : int
IfrClusterVisitor<int>
operate (Ifr3DCluster*) : intoperate (Ifr3DComposite*) : intoperate (Ifr2DCluster*) : int
IfrClusterVisitor<class Point>
operate (Ifr3DCluster*) : Pointoperate (Ifr3DComposite*) : Pointoperate (Ifr2DCluster*) : Point
IfrVstCenterOfGravity
operate (Ifr3DCluster*) : Pointoperate (Ifr3DComposite*) : Pointoperate (Ifr2DCluster*) : Point
IfrVstHitLayers
operate (Ifr3DCluster*) : intoperate (Ifr3DComposite*) : intoperate (Ifr2DCluster*) : int
Luca Lista
Visitor patternVisitor pattern
• Diagramma di interazione
theCluster : Ifr3DComposite
theCOGInstance : IfrVstCenterOfGravity
theClient
operate (this)
getSomeInformation()
accept (theCOGInstance)
doSomeComputation()
Luca Lista
Introduzione di un nuovo tipo di cluster
Introduzione di un nuovo tipo di cluster
• Nuovo layout dell’RPC clilindrico con lettura stereo
• Non è più possibile usare clustering 2D
• Il clustering composito non può più essere costituito da elementi omogenei
Luca Lista
Beta: l’interfaccia all’analisiBeta: l’interfaccia all’analisi
“provide a simple, common basis for writing detailed physics analysis programs”
• Facile da usare– non bisogna essere esperti di C++
• Fornisce potenzialità di analisi complete
• Lo stesso codice piu’ girare su diversi campioni di dati:– full simulation– fast simulation– dati reali
Luca Lista
Oggetti in BetaOggetti in Beta
•BtaCandidate– candidato particella
•BtaOperator– operatore che combina le
particelle
•BtaFinder•BtaAssociator
Luca Lista
BtaCandidateBtaCandidate
• HepLorentzVector p4();• Hep3Vector p3();• double charge();• double mass();• BtaAbsVertex* decayVtx();• PdtEntry* pdtEntry();• TrkRecoTrk* recoTrk();• ...
• Relazione madre-figlio
• Gestione di candidati compositi (es.: KS +-)
• Accesso alle informazioni dei sotto-rivelatori e di PID
Luca Lista
BtaOperatorBtaOperator
• BtaOpAdd4– somma i 4-momenti e le cariche
• BtaOpVertex– combina i vertici
• ma anche fit con vincoli di massa, etc.
– BtaOpAdd4 o;– BtaCandidate t1, t2, t3;
– BtaCandidate t12 = o.combine(t1, t2);
– BtaCandidate t123 = o.combine(t1, t2, t3);
Luca Lista
BtaFinderBtaFinder
• HepAList<BtaCandidate> list;• BtaV0Finder k0s(list, .420,.540);
• BtaV0Finder psis(list, 2.8, 3.4);
• analogamente avremo, finder di , K*, D, B, etc.– BtaVFinder, BtaV0Finder, BtaPidFinder, …
• I finder usano i combiner
Luca Lista
BtaAssociatorBtaAssociator
• BtaMcAssoc– Monte Carlo truth (package PDT)
• Collegamenti MonteCarlo - Particelle ricostruite
– BtaMcAssoc *truthMap;– BtaCandidate *reco;– BtaCandidate *mc = truthMap ->mcFromReco(reco);
Luca Lista
BaBar Event StoreBaBar Event Store
• BaBar ha adottato un database a oggetti per l’event store
• Le motivazioni, rispetto all’uso di un file sequenziale, sono che:– non e’ necessario caricare tutti gli
eventi se bisogna analizzarne solo alcuni
– è possibile caricare solo parte delle informazioni dell’evento da analizzare
– Il livello di dettaglio da esplorare può essere diverso evento per evento
• BaBar usa Objectivity sia per l’event store che per le calibrazioni e allineamenti
Luca Lista
BaBar Event StoreBaBar Event Store
• L’evento viene suddiviso in unità modulari che possono essere caricate separatamente evento per evento
• Parte dei dati può essere acceduta via rete
RawRaw 25kB25kB
EventEvent
RecRec 100kB100kB
EsdEsd 10kB10kB
AodAod 1kB1kB
TagTag 100B100B
HdrHdr <64B<64B
SimSim ??????
TruTru ??????
Luca Lista
Vincoli per gli oggetti persistentiVincoli per gli oggetti persistenti
• Ogni classe persistente deve ereditare da d_Object (ooObj)
• Oggetti persistenti non possono contenere puntatori a oggetti transienti ma solo “smart pointers” a oggetti persistenti (d_Ref<T>, o ooRef(T))
• Modificare una classe richiede modificare lo schema della classe nel database per poter continuare a usare oggetti precedentemente immagazzinati.
• BaBar ha sperimentato problemi nell’uso dello schema evolution
Luca Lista
ooHandlke(ooFDObj) fdbH;ooItr(Patron) patronItr;const char* pred =“((_firstName =˜ “.*James.*”) AND (_address =˜ “.*Virginia.*”))”;
patronItr.scan(fdbH, pred);while(patronItr.next()){ patronItr.print();}
1)
ObjectivityObjectivity
• Objectivity, come altri OODB, è molto intrusivo
• Usare Objy come suggerito dalla ditta rende il software completamente dipendente da un prodotto commerciale
• Objy può rompere l’incapsulamento!
1) © Objectivity Inc., dal corso tenuto Mountain View
Luca Lista
BaBar Event StoreBaBar Event Store
• BaBar ha scelto un approccio che lo rende meno dipendente da Objy:– separare le classi transienti dalle
classi persistenti
• Questo richiede una grossa estensione del disegno, ma tutto il codice (transiente) fino ad ora scritto e funzionante non deve essere modificato
MyRecoObjMyRecoObj MyRecoObjPMyRecoObjP
Luca Lista
BaBar Event StoreBaBar Event Store
• Vantaggi:– indipendenza dal prodotto: cambiare
DB richiede modifiche in un ben determinato settore del codice
– il codice in uso non va modificato
– maggior robustezza
• Svantaggi:– si perdono diverse potenzialità:
• accesso automatico ai dati in uso
• nessun meccanismo esterno necessario alla persistenza
– duplicazione delle classi (Xxx XxxP)
– extra codice per la gestione dell’accesso al DB e della conversione transiente persistente
Luca Lista
BaBar Event StoreBaBar Event Store
• Come passare da un oggetto transiente a un oggetto persistente:
AbsObjectAbsObject
ConcObj1ConcObj1 ConcObj2ConcObj2
AbsObjectPAbsObjectP
ConcObj1PConcObj1P ConcObj2PConcObj2P
FactoryFactory
Luca Lista
ObjListPObjListP
ObjListPObjListP
Oggetti persistenti compositiOggetti persistenti compositi
• E’ conveniente compattare in un solo oggetto più oggetti semplici– es.: Geant Hits, Digis
• Implementare i puntatori non è immediato...
ObjObj ObjObj ObjObj ObjObj
ObjObj ObjObj ObjObj ObjObj
Luca Lista
ConclusioniConclusioni
• Il software OO di BaBar è in sviluppo da > 2.5 anni
• E’ stata acquisita una enorme esperienza sull’uso delle nuove tecnologie software– OO A&D
– C++ e librerie standard
– Objectivity
– etc.
• I risultati sono più che soddisfacenti• Si rivolge sempre più enfasi sulla
qualità del processo di sviluppo
• L’anno prossimo il software verrà messo alla prova su dati reali!
Top Related