/****************************************************************\ | This file is part of the PAX example files for CDF | | -------------------------------------------------------------- | | Author of the last change: $Author: erdmann $ | Date of last change: $Date: 2003/11/18 15:13:17 $ | Revision number: $Revision: 1.2 $ \****************************************************************/ // //! example interface: fill CDF calorimeter towers into PAX event interpretation // #include "TPAXAnaModule.hh" #include "PAX/PAXexperimentclass.hh" #include "PAX/PAXfourvector.hh" #include "PAX/PAXinterpret.hh" #include "PAX/PAXiterator.hh" #include "PAX/PAXphysicsmap.hh" #include "PAX/PAXvertex.hh" #include bool TPAXAnaModule::FillCalorimeter(PaxEventInterpret* ei, int currentevent){ bool vertexOK = 0; bool caloOK = 0; bool eventOK = 0; // fill the vertices from the VertexBlock into the event interpretation vertexOK = FillVertices(ei, currentevent); // fill the calorimter towers from the CalDataBlock into the event interpretation if (fCalData) { // set name of event interpretation ei->SetPaxName("calorimeter towers"); // read Stntuple data fCalData->GetEntry(currentevent); // loop over all CDF calorimeter towers int ntowers = fCalData->NTowers(); for (int i=0; iTower(i); // create empty pax fourvector PaxFourVector* vector4 = new PaxFourVector; // add fourvector to the event interpretation ei->Add(vector4); // set kinematics and name vector4-> SetPx((double) tower->Energy()*sin((tower->Theta())/180*PI)*cos(tower->Phi())); vector4-> SetPy((double) tower->Energy()*sin((tower->Theta())/180*PI)*sin(tower->Phi())); vector4-> SetPz((double) tower->Energy()*cos((tower->Theta())/180*PI)); vector4-> SetE ((double) tower->Energy()); vector4-> SetPaxName("caltower"); // ---------------------------------------------------------------- // in order to enable access to the original CDF data within PAX, // register an experiment relation to the instance of the TCalTower // class // create empty experiment relation PaxExperimentClassRelations* experiment_class_relation = new PaxExperimentClassRelations; // add a manager with pax vertex under the name of the CDF class string experiment_class_manager = "TCalTower"; vector4->map_experimentclass_relations ->Add( experiment_class_manager, experiment_class_relation ); // register the CDF tower instance with the experiment class relation PaxExperimentClass* ec = new PaxExperiment(tower); experiment_class_relation->Add( tower->EtaPhi(), ec ); } caloOK = 1; // there have to be some towers to accept the event } else cerr << "fCalDataBlock was not found in the STNTUPLE!!" << endl; //------------------------------------------------------------ // connect all calorimeter towers to the primary vertex if (vertexOK & caloOK) { // iterator for vertices PaxIterator* iter_vx = ei->vertex->GetIterator(); // search for the primary vertex PaxVertex* primary_vertex = 0; iter_vx->First(); while ( !primary_vertex && !iter_vx->IsDone() ) { if (iter_vx->CurrentItem()->GetPaxName() == "primary vertex") primary_vertex = iter_vx->CurrentItem(); iter_vx->Next(); } // connect all towers to the primary vertex: // here we set the begin vertex relations of all fourvectors, // as well as the outgoing fourvector relations of the vertex if ( primary_vertex ) { PaxIterator < PaxFourVector* >* iter_fv = ei->fourvector->GetIterator(); for ( iter_fv->First(); !iter_fv->IsDone(); iter_fv->Next() ) iter_fv->CurrentItem()->begin_vertex_relations-> Add( primary_vertex, iter_fv->CurrentItem() ); } } eventOK = caloOK; return eventOK; } //_____________________________________________________________________________