Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

higgsTreeNewXana.cpp

Go to the documentation of this file.
00001 //
00002 #include <XANADOO/domain/interface/XANAEsdEvent.h>
00003 #include <XANADOO/XANAMcInfo/interface/XANAGeneratorEvent.h>
00004 #include <XANADOO/XANAMcInfo/interface/XANAGeantEvent.h>
00005 #include <XANADOO/XANAMcInfo/interface/XANAGeneratorParticle.h>
00006 
00007 #include <XANADOO/XANAMcInfo/interface/XANAGeantTrack.h>
00008 #include <XANADOO/XANAMcInfo/interface/XANAGeantVertex.h>
00009 
00010 #include <XANADOO/XANAElectronCandidate/interface/XANAElectronGSFTrack.h>
00011 #include <XANADOO/XANAClusters/interface/XANACaloRecHit.h>
00012 #include <XANADOO/XANATracks/interface/XANATrackHit.h>
00013 #include <XANADOO/XANAClusters/interface/XANACluster.h>
00014 #include <XANADOO/XANAClusters/interface/XANAEmCluster.h>
00015 #include <XANADOO/XANAClusters/interface/XANASuperCluster.h>
00016 #include <XANADOO/XANAClusters/interface/XANACaloRecHit.h>
00017 #include <XANADOO/XANAElectronCandidate/interface/XANAElectronCandidate.h>
00018 #include <XANADOO/XANAVertex/interface/XANAVertex.h>
00019 
00020 #include <CLHEP/Geometry/Point3D.h>
00021 
00022 #include "TFile.h"
00023 #include "TBranch.h"
00024 #include "TObjArray.h"
00025 #include "TRefArray.h"
00026 #include "TTree.h"
00027 #include "TChain.h"
00028 
00029 #include <XANADOO/XANAnalysisZZ/interface/treeStruct.h>
00030 
00031 #include <map>
00032 #include <vector>
00033 
00034 #define PI 3.14159265358979323846
00035 
00036 #define SIGMA_EB 0.04
00037 #define SIGMA_EE 0.150
00038 
00039 using namespace std;
00040 
00041 void globalReset(simpleEvent *e);
00042 void kineReset(simpleGeneratorEvent *k);
00043 
00044 int mom(int idx, TObjArray *tracks);
00045 XANAGeantVertex *getDaughterVertex(XANAGeantTrack *gtk, TObjArray *tracks);
00046 
00047 
00048 void setAddr(TTree *T, XANAEsdEvent *event, XANAGeneratorEvent *generatorEvent, XANAGeantEvent *geantEvent)
00049 {
00050         T->SetBranchAddress("Event.",&event);
00051         T->SetBranchStatus("Event.",0);
00052         T->SetBranchAddress("GeneratorEvent.",&generatorEvent);
00053         T->SetBranchAddress("GeantEvent.",&geantEvent);   
00054 }
00055 
00056 
00057 
00058 int main(int argc, char** argv)
00059 {
00060         if (argc==1) {
00061                 printf("Usage: elTree [XANADOO tree]\n");
00062                 exit(1);
00063         }
00064 
00065         XANAEsdEvent *event = new XANAEsdEvent();
00066         XANAGeneratorEvent *generatorEvent = new XANAGeneratorEvent();
00067         XANAGeantEvent *geantEvent = new XANAGeantEvent();
00068 
00069         TFile *fout = new TFile("higgsTree.root","RECREATE");
00070 
00071 
00072         TTree *tree = new TTree("tree","tree");
00073 
00074         /*
00075          * tree structure
00076          */
00077         simpleEvent e;
00078         simpleGeneratorEvent k;
00079         // general info
00080         tree->Branch("k",&k.ievent,
00081                         "ievent/I"
00082                         ":ifirst/I" // ifirst==0 to take kine info just once
00083                         ":nple/I"
00084                         ":pid[10]/I"
00085                         ":mom[10]/I"
00086                         ":x[10][4]/F"
00087                         ":p[10][4]/F"
00088                         ":pMag[10]/F"
00089                         ":pT[10]/F"
00090                         ":eta[10]/F"
00091                         ":phi[10]/F"
00092                         ":mH/F"
00093                         ":mZ1/F"
00094                         ":mZ2/F"
00095                     );
00096         tree->Branch("e",&e.ievent,
00097                         "ievent/I"
00098                         // kine info
00099                         ":kn_deltaRKine/F"
00100                         ":kn_pid/I"
00101                         ":kn_pidMo1/I"
00102                         ":kn_lineMo1/I"
00103                         ":kn_pidMo2/I"
00104                         ":kn_lineMo2/I"
00105                         ":kn_E/F"
00106                         ":kn_pT/F"
00107                         ":kn_eta/F"
00108                         ":kn_phi/F"
00109                         ":kn_x[4]/F"
00110                         ":kn_p[4]/F"
00111                         ":kn_pMag/F"
00112                         // ecal info
00113                         ":sc_isc/I"
00114                         ":sc_nsc/I"
00115                         ":sc_Erec/F"
00116                         ":sc_ErecUncorr/F"
00117                         ":sc_ErecScaleFactor/F"
00118                 ":sc_ErecS1/F"
00119                 ":sc_ErecS4/F"
00120                 ":sc_ErecS9/F"
00121                 ":sc_ErecS25/F"
00122                 ":sc_eta/F"
00123                 ":sc_phi/F"
00124                 ":sc_seedE/F"
00125                 ":sc_seedEta/F"
00126                 ":sc_seedPhi/F"
00127                 ":sc_seedNxtals/I"
00128                 ":sc_seedNxtals2sigma/I"
00129                 ":sc_nBrems/I"
00130                 ":sc_bremEtot/F"
00131                 ":sc_bremNxtals/I"
00132                 ":sc_bremNxtals2sigma/I"
00133                 // tracker info
00134                 ":tk_ntk/I"
00135                 ":tk_itk/I"
00136                 //
00137                 ":tk_xetaFP/F"
00138                 ":tk_xphiFP/F"
00139                 ":tk_xFP[3]/F"
00140                 ":tk_xetaLP/F"
00141                 ":tk_xphiLP/F"
00142                 ":tk_xLP[3]/F"
00143                 //
00144                 ":tk_petaFPmode/F"
00145                 ":tk_pphiFPmode/F"
00146                 ":tk_pFPmode[3]/F"
00147                 ":tk_pFPmodeMag/F"
00148                 ":tk_petaFPmean/F"
00149                 ":tk_pphiFPmean/F"
00150                 ":tk_pFPmean[3]/F"
00151                 ":tk_pFPmeanMag/F"
00152                 //
00153                 ":tk_petaLPmode/F"
00154                 ":tk_pphiLPmode/F"
00155                 ":tk_pLPmode[3]/F"
00156                 ":tk_pLPmodeMag/F"
00157                 ":tk_petaLPmean/F"
00158                 ":tk_pphiLPmean/F"
00159                 ":tk_pLPmean[3]/F"
00160                 ":tk_pLPmeanMag/F"
00161                 //
00162                 ":tk_petaVXmode/F"
00163                 ":tk_pphiVXmode/F"
00164                 ":tk_pVXmode[3]/F"
00165                 ":tk_pVXmodeMag/F"
00166                 ":tk_petaVXmean/F"
00167                 ":tk_pphiVXmean/F"
00168                 ":tk_pVXmean[3]/F"
00169                 ":tk_pVXmeanMag/F"
00170                 //
00171                 ":tk_tkNhits/I"
00172                 ":tk_tkNLostHits/I"
00173                 ":tk_chi2OverDof/F"
00174                 ":tk_chi2OverDofBack/F"
00175                 ":tk_chargeRec/I"
00176                 ":tk_highestWeightFP/F"
00177                 ":tk_highestWeightLP/F"
00178                 ":tk_highestWeightVX/F"
00179                 // vertex info
00180                 ":vx_x[3]/F"
00181                 ":vx_xeDiag[3]/F"
00182                 ":vx_xeOffDiag[3]/F"
00183                 ":vx_chi2/F"
00184                 ":vx_chi2Norm/F"
00185                 ":vx_Ndof/I"
00186                 ":vx_vectSum[3]/F"
00187                 // electron candidate info
00188                 ":el_iel/I"
00189                 ":el_phi/F"
00190                 ":el_eta/F"
00191                 ":el_pVX[3]/F"
00192                 ":el_pVXMag/F"
00193                 ":el_pTVX/F"
00194                 ":el_pEC[3]/F"
00195                 ":el_pECMag/F"
00196                 ":el_DetaScTkVx/F"
00197                 ":el_DetaScTkEc/F"
00198                 ":el_DetaSeedTkEc/F"
00199                 ":el_DphiScTkVx/F"
00200                 ":el_DphiScTkEc/F"
00201                 ":el_DphiSeedTkEc/F"
00202                 ":el_tkIso/F"
00203                 ":el_ecIso/F"
00204                 ":el_EOP/F"
00205                 ":el_EseedOP/F"
00206                 ":el_HOE/F"
00207                 // event trigger info
00208                 ":tg_l1D/b"
00209                 ":tg_hltD/b"
00210                 ":tg_l1R[128]/b"
00211                 ":tg_hltR[152]/b"
00212                 );
00213 
00214         // >>> added to bypass the TChain problem
00215         TTree *T;
00216         Int_t nevent=0;
00217         Int_t nb = 0; 
00218         e.ievent=0;
00219         k.ievent=0;
00220         for (int i=1; i<argc; i++) {
00221                 printf("--> %s\n",argv[i]);
00222                 TFile *F = new TFile(argv[i]);
00223                 if (!(F->GetNkeys())) {
00224                         printf("File %s has no key --> skipping\n",argv[i]);
00225                         continue;
00226                 }
00227                 T = (TTree*)F->Get("ESD");
00228                 nevent = (Int_t)T->GetEntries();
00229                 printf("Going to read %d events...\n",nevent);
00230                 setAddr(T,event,generatorEvent,geantEvent);
00231                 // <<< added to bypass the TChain problem
00232 
00233                 /*
00234                  * main event loop...
00235                  */
00236                 TRefArray *gen=0;
00237                 TRefArray *genAll=0;
00238                 TObjArray *tracks=0;
00239                 TObjArray *sc=0;
00240                 //nevent = 1;
00241                 for (Int_t iev=0; iev<nevent; iev++) {
00242                         nb += T->GetEntry(iev); 
00243                         ++e.ievent;
00244                         ++k.ievent;
00245 
00246                         if (iev%50==1) fprintf(stdout,"  Event % 5d\n",iev);
00247 
00248                         tracks = geantEvent->getGeantTracks();
00249                         gen = generatorEvent->getStableSignalParticles();
00250                         genAll = generatorEvent->getSignalParticles();
00251 
00252                         kineReset(&k);
00253                         /*
00254                          * Event Kine info
00255                          */
00256                         vector<int> plist;
00257                         int ifirstel=0;
00258                         int aZ=0;
00259                         // find electrons...
00260                         for (int ip=0; ip<generatorEvent->getNumberOfStableSignalParticles(); ip++) {
00261                                 XANAGeneratorParticle *gp = (XANAGeneratorParticle*)(*gen)[ip];
00262                                 if (abs(gp->getPartId())!=11 && abs(gp->getPartId())!=22) continue;
00263                                 int mo1 = gp->getMo1();
00264                                 int line=0;
00265                                 // ...coming from a Z (+trick to consider also indirect decays Z->[...]->e)
00266                                 while (1) {
00267                                         XANAGeneratorParticle *gpMoN = (XANAGeneratorParticle*)(*genAll)[mo1-1];
00268                                         mo1 = gpMoN->getMo1();
00269                                         if ((gpMoN->getPartId()==23 && gpMoN->getStatus()==3)) {
00270                                                 line = gpMoN->getLine();
00271                                                 break;
00272                                         }
00273                                         if (mo1==0) break;
00274                                 }
00275                                 if (line) {
00276                                         if (ifirstel==0) {
00277                                                 aZ = line;
00278                                                 ifirstel=1;
00279                                         }
00280                                         // ip>0 --> a Z;  ip<0 --> the other one
00281                                         if (line==aZ) plist.push_back(ip);
00282                                         else plist.push_back(-ip);
00283                                 }
00284                         }
00285                         k.nple = (int)plist.size();
00286                         float ptot[4];
00287                         float pZ1[4];
00288                         float pZ2[4];
00289                         for (int j=0; j<4; j++) {
00290                                 ptot[j]=0;
00291                                 pZ1[j] =0;
00292                                 pZ2[j] =0;
00293                         }
00294                         // order electrons in pT
00295                         map<float,int> ptlist;
00296                         for (unsigned int ip=0; ip<plist.size(); ip++) {
00297                                 XANAGeneratorParticle *gp = (XANAGeneratorParticle*)(*gen)[abs(plist[ip])];
00298                                 ptlist[gp->getMomentum().vect().perp()] = ip;
00299                         }
00300                         // fill variables
00301                         map<float,int>::reverse_iterator rit;
00302                         int cnt=0;
00303                         for (rit=ptlist.rbegin(); rit!=ptlist.rend(); rit++) {
00304                                 int ip = rit->second;
00305                                 XANAGeneratorParticle *gp = (XANAGeneratorParticle*)(*gen)[abs(plist[ip])];
00306 
00307                                 k.pid[cnt]     = gp->getPartId();
00308                                 k.mom[cnt]     = (int)copysign(1,plist[ip]); // +1 a Z; -1 the other one
00309                                 k.x[cnt][0]    = gp->getVertex().x();
00310                                 k.x[cnt][1]    = gp->getVertex().y();
00311                                 k.x[cnt][2]    = gp->getVertex().z();
00312                                 k.x[cnt][3]    = gp->getVertex().e();
00313                                 k.p[cnt][0]    = gp->getMomentum().x();
00314                                 k.p[cnt][1]    = gp->getMomentum().y();
00315                                 k.p[cnt][2]    = gp->getMomentum().z();
00316                                 k.p[cnt][3]    = gp->getMomentum().e();
00317                                 k.pMag[cnt]    = gp->getMomentum().vect().mag();
00318                                 k.pT[cnt]      = gp->getMomentum().vect().perp();
00319                                 k.eta[cnt]     = gp->getMomentum().eta();
00320                                 k.phi[cnt]     = gp->getMomentum().phi();
00321 
00322                                 for (int j=0; j<4; j++) {
00323                                         ptot[j] += k.p[cnt][j];
00324                                         if (k.mom[cnt]>0) pZ1[j] += k.p[cnt][j];
00325                                         else pZ2[j] += k.p[cnt][j];
00326                                 }
00327                                 cnt++;
00328 
00329                                 //printf("%- d %- 1.f\n",gp->getPartId(),copysign(1,plist[ip]));
00330                         }
00331                         float mmH=0, mmZ1=0, mmZ2=0;
00332                         // Higgs and Z invariant masses (from the electrons!)
00333                         for (int i=0; i<3; i++) {
00334                                 mmH  -= ptot[i]*ptot[i];
00335                                 mmZ1 -= pZ1[i]*pZ1[i];
00336                                 mmZ2 -= pZ2[i]*pZ2[i];
00337                         }
00338                         mmH  += ptot[3]*ptot[3];
00339                         mmZ1 += pZ1[3]*pZ1[3];
00340                         mmZ2 += pZ2[3]*pZ2[3];
00341 
00342                         k.mH  = sqrt(mmH);
00343                         if (mmZ1>mmZ2) {
00344                                 k.mZ1 = sqrt(mmZ1);
00345                                 k.mZ2 = sqrt(mmZ2);
00346                         } else {
00347                                 k.mZ2 = sqrt(mmZ1);
00348                                 k.mZ1 = sqrt(mmZ2);
00349                         }
00350                         plist.clear();
00351                         ptlist.clear();
00352 
00353                         /*
00354                          * SC/tracks quantities
00355                          */
00356 
00357                         // event trigger info
00358                         // reset
00359                         e.tg_l1D=0;
00360                         e.tg_hltD=0;
00361                         for (int i=0; i<128; i++) e.tg_l1R[i]=0;
00362                         for (int i=0; i<152; i++) e.tg_hltR[i]=0;
00363                         // get the info
00364                         XANATriggerInfo xtg = event->getTriggerInfo();
00365                         e.tg_l1D  = xtg.getGlobalL1Decision();
00366                         e.tg_hltD = xtg.getHltDecision();
00367                         cout << xtg.getGlobalL1Decision() << " " << xtg.getHltDecision() << " " << endl;
00368                         TBits tb;
00369                         tb = xtg.getGlobalL1Response();
00370                         for (int i=0; i<16*8; i++) {
00371                                 e.tg_l1R[i] = tb.TestBitNumber(i);
00372                         }
00373                         tb = xtg.getHltResponse();
00374                         for (int i=0; i<19*8; i++) {
00375                                 e.tg_hltR[i] = tb.TestBitNumber(i);
00376                         }
00377 
00378                         int ifilled=0;
00379                         // super clusters
00380                         sc = event->getSuperClusters();
00381                         e.sc_nsc = event->getNumberOfSuperClusters(); // number of supercluster in the event
00382                         e.sc_isc=0;
00383                         //e.sc_nsc = 1;
00384                         //printf("Event: %d ------------------------- number of SuperClusters = %d\n",iev,e.sc_nsc);
00385                         // fill SC variables
00386                         for (int iisc=0; iisc<e.sc_nsc; iisc++) {
00387                                 // reset quantities
00388                                 globalReset(&e);
00389                                 //measuredReset(&e);
00390 
00391                                 XANASuperCluster *xsc = (XANASuperCluster*)(*sc)[iisc];
00392 
00393                                 // generator particle info:
00394                                 //   associate a SC with the closest (in DeltaR) generator particle
00395                                 //   no cut on DeltaR (left for the successive analysis)
00396                                 HepPoint3D point = xsc->getPosition();
00397                                 point.setMag(xsc->getEnergy());
00398                                 HepLorentzVector vecLor( point.x(), point.y(), point.z(), xsc->getEnergy());
00399                                 map<float, int> deltaR;
00400                                 deltaR.clear();
00401                                 TRefArray *gen = generatorEvent->getStableSignalParticles();
00402                                 TObjArray *genAll = generatorEvent->getParticles();
00403                                 for (int ip=0; ip<generatorEvent->getNumberOfStableSignalParticles(); ip++) {
00404                                         XANAGeneratorParticle *genpar = (XANAGeneratorParticle*)(*gen)[ip];
00405                                         if (abs(genpar->getPartId())==11
00406                                                         || genpar->getPartId()==22 && 
00407                                                         genpar->getMomentum().e()/xsc->getEnergy()>.1) 
00408                                                 deltaR[vecLor.deltaR(genpar->getMomentum())] = ip;
00409                                 }
00410                                 XANAGeneratorParticle *genpar = (XANAGeneratorParticle*)(*gen)[deltaR.begin()->second];
00411                                 XANAGeneratorParticle *genparMo1 = (XANAGeneratorParticle*)(*genAll)[genpar->getMo1()-1];
00412                                 XANAGeneratorParticle *genparMo2 = (XANAGeneratorParticle*)(*genAll)[genparMo1->getMo1()-1];
00413 
00414                                 e.kn_deltaR  = deltaR.begin()->first;
00415                                 e.kn_x[0]    = genpar->getVertex().x();
00416                                 e.kn_x[1]    = genpar->getVertex().y();
00417                                 e.kn_x[2]    = genpar->getVertex().z();
00418                                 e.kn_x[3]    = genpar->getVertex().e();
00419                                 e.kn_p[0]    = genpar->getMomentum().x();
00420                                 e.kn_p[1]    = genpar->getMomentum().y();
00421                                 e.kn_p[2]    = genpar->getMomentum().z();
00422                                 e.kn_p[3]    = genpar->getMomentum().e();
00423                                 e.kn_pMag    = genpar->getMomentum().vect().mag();
00424                                 e.kn_E       = genpar->getMomentum().e();
00425                                 e.kn_pT      = genpar->getMomentum().vect().perp();
00426                                 e.kn_eta     = genpar->getMomentum().eta();
00427                                 e.kn_phi     = genpar->getMomentum().phi();
00428                                 e.kn_pT      = genpar->getMomentum().vect().perp();
00429                                 e.kn_eta     = genpar->getMomentum().eta();
00430                                 e.kn_phi     = genpar->getMomentum().phi();
00431                                 e.kn_pid     = genpar->getPartId();
00432                                 e.kn_pidMo1  = genparMo1->getPartId();
00433                                 e.kn_lineMo1 = genparMo1->getLine();
00434                                 e.kn_pidMo2  = genparMo2->getPartId();
00435                                 e.kn_lineMo2 = genparMo2->getLine();
00436 
00437                                 ++e.sc_isc;
00438 
00439                                 e.sc_Erec    = xsc->getEnergy();
00440                                 e.sc_ErecS1  = xsc->getSum1();
00441                                 e.sc_ErecS4  = xsc->getSum4();
00442                                 e.sc_ErecS9  = xsc->getSum9();
00443                                 e.sc_ErecS25 = xsc->getSum25();
00444                                 e.sc_ErecScaleFactor = xsc->getEnergyScaleFactor();
00445                                 e.sc_ErecUncorr = e.sc_Erec/e.sc_ErecScaleFactor;
00446                                 e.sc_eta = xsc->getPosition().eta();
00447                                 e.sc_phi = xsc->getPosition().phi();
00448 
00449                                 e.sc_seedE   = xsc->getSeedCluster()->getEnergy();
00450                                 e.sc_seedEta = xsc->getSeedCluster()->getPosition().eta();
00451                                 e.sc_seedPhi = xsc->getSeedCluster()->getPosition().phi();
00452                                 e.sc_nBrems  = xsc->getNumberOfBrems();
00453 
00454                                 TRefArray *cbrems = xsc->getBremClusters();
00455                                 XANACluster *seed = xsc->getSeedCluster();
00456                                 e.sc_seedE   = seed->getEnergy();
00457                                 e.sc_seedEta = seed->getPosition().eta();
00458                                 e.sc_seedPhi = seed->getPosition().phi();
00459                                 e.sc_seedNxtals = seed->getNumberOfRecHits();
00460                                 TRefArray *seedHits = seed->getEmClusterHits();
00461                                 float threshold;
00462                                 if (fabs(e.sc_eta)<1.48) threshold = 2.*SIGMA_EB;
00463                                 else                    threshold = 2.*SIGMA_EE;
00464                                 for (int irh=0; irh<e.sc_seedNxtals; irh++) {
00465                                         XANACaloRecHit *caloRhit = (XANACaloRecHit*)(*seedHits)[irh];
00466                                         if (caloRhit->getEnergy()>threshold) e.sc_seedNxtals2sigma++;
00467                                 }
00468                                 // brem clusters variables
00469                                 for (int ibc=0; ibc<e.sc_nBrems; ibc++) {
00470                                         XANAEmCluster *bc = (XANAEmCluster*)(*cbrems)[ibc];
00471                                         e.sc_bremEtot += bc->getEnergy();
00472                                         e.sc_bremNxtals += bc->getNumberOfRecHits();
00473                                         int bremNxtalsTmp = bc->getNumberOfRecHits();
00474                                         TRefArray *bremHits = bc->getEmClusterHits();
00475                                         for (int irh=0; irh<bremNxtalsTmp; irh++)
00476                                                 if (((XANACaloRecHit*)(*bremHits)[irh])->getEnergy()>2*threshold) {
00477                                                         e.sc_bremNxtals2sigma++;
00478                                                 }
00479                                 }
00480 
00481 
00482                                 // rough matching with a track
00483                                 //map<float, int> deltaR;
00484                                 deltaR.clear();
00485                                 TObjArray *gsfTks = event->getElectronTracks();
00486                                 for (int ip=0; ip<event->getNumberOfElectronTracks(); ip++) {
00487                                         XANAElectronGSFTrack *gsfTk = (XANAElectronGSFTrack*)(*gsfTks)[ip];
00488                                         float eta_tk = gsfTk->getGSFMomentumAtVertexMode().eta();
00489                                         float eta_sc = xsc->getPosition().eta();
00490                                         float phi_tk = gsfTk->getGSFMomentumAtVertexMode().phi();
00491                                         float phi_sc = xsc->getPosition().phi();
00492 
00493                                         float deta = eta_sc - eta_tk;
00494                                         float dphi = phi_sc - phi_tk;
00495                                         if (fabs(dphi) > PI) dphi = dphi < 0 ? 2.*PI + dphi : dphi - 2.*PI;
00496 
00497                                         deltaR[ sqrt(deta*deta+dphi*dphi) ] = ip;
00498                                 }
00499 
00500                                 map<float, int>::iterator it;
00501                                 vector<int> tkList;
00502                                 // compute total number of tracks for a given SC
00503                                 for (it=deltaR.begin(); it!=deltaR.end(); it++) {
00504                                         if (it->first<1.) {
00505                                                 //printf("  taking track with deltaR = %f\n",it->first);
00506                                                 tkList.push_back(it->second);
00507                                                 ++e.tk_ntk;
00508                                         }
00509                                 }
00510                                 // accept/reject the matching and fill tk_tracks variables
00511                                 for (unsigned int iitk=0; iitk<tkList.size(); iitk++) {
00512                                         ++e.tk_itk;
00513                                         XANAElectronGSFTrack *gsfTk = (XANAElectronGSFTrack*)(*gsfTks)[tkList[iitk]];
00514 
00515                                         e.tk_xetaFP     = gsfTk->getPositionAtFirstPoint().eta();
00516                                         e.tk_xphiFP     = gsfTk->getPositionAtFirstPoint().phi();
00517                                         e.tk_xFP[0]     = gsfTk->getPositionAtFirstPoint().x();
00518                                         e.tk_xFP[1]     = gsfTk->getPositionAtFirstPoint().y();
00519                                         e.tk_xFP[2]     = gsfTk->getPositionAtFirstPoint().z();
00520 
00521                                         e.tk_xetaLP     = gsfTk->getPositionAtLastPoint().eta();
00522                                         e.tk_xphiLP     = gsfTk->getPositionAtLastPoint().phi();
00523                                         e.tk_xLP[0]     = gsfTk->getPositionAtLastPoint().x();
00524                                         e.tk_xLP[1]     = gsfTk->getPositionAtLastPoint().y();
00525                                         e.tk_xLP[2]     = gsfTk->getPositionAtLastPoint().z();
00526 
00527                                         e.tk_petaFPmode = gsfTk->getGSFMomentumAtFirstPointMode().eta();
00528                                         e.tk_pphiFPmode = gsfTk->getGSFMomentumAtFirstPointMode().phi();
00529                                         e.tk_pFPmode[0] = gsfTk->getGSFMomentumAtFirstPointMode().x();
00530                                         e.tk_pFPmode[1] = gsfTk->getGSFMomentumAtFirstPointMode().y();
00531                                         e.tk_pFPmode[2] = gsfTk->getGSFMomentumAtFirstPointMode().z();
00532                                         e.tk_pFPmodeMag = gsfTk->getGSFMomentumAtFirstPointMode().mag();
00533                                         e.tk_petaFPmean = gsfTk->getGSFMomentumAtFirstPointWeightedMean().eta();
00534                                         e.tk_pphiFPmean = gsfTk->getGSFMomentumAtFirstPointWeightedMean().phi();
00535                                         e.tk_pFPmean[0] = gsfTk->getGSFMomentumAtFirstPointWeightedMean().x();
00536                                         e.tk_pFPmean[1] = gsfTk->getGSFMomentumAtFirstPointWeightedMean().y();
00537                                         e.tk_pFPmean[2] = gsfTk->getGSFMomentumAtFirstPointWeightedMean().z();
00538                                         e.tk_pFPmeanMag = gsfTk->getGSFMomentumAtFirstPointWeightedMean().mag();
00539 
00540                                         e.tk_petaLPmode = gsfTk->getGSFMomentumAtLastPointMode().eta();
00541                                         e.tk_pphiLPmode = gsfTk->getGSFMomentumAtLastPointMode().phi();
00542                                         e.tk_pLPmode[0] = gsfTk->getGSFMomentumAtLastPointMode().x();
00543                                         e.tk_pLPmode[1] = gsfTk->getGSFMomentumAtLastPointMode().y();
00544                                         e.tk_pLPmode[2] = gsfTk->getGSFMomentumAtLastPointMode().z();
00545                                         e.tk_pLPmodeMag = gsfTk->getGSFMomentumAtLastPointMode().mag();
00546                                         e.tk_petaLPmean = gsfTk->getGSFMomentumAtLastPointWeightedMean().eta();
00547                                         e.tk_pphiLPmean = gsfTk->getGSFMomentumAtLastPointWeightedMean().phi();
00548                                         e.tk_pLPmean[0] = gsfTk->getGSFMomentumAtLastPointWeightedMean().x();
00549                                         e.tk_pLPmean[1] = gsfTk->getGSFMomentumAtLastPointWeightedMean().y();
00550                                         e.tk_pLPmean[2] = gsfTk->getGSFMomentumAtLastPointWeightedMean().z();
00551                                         e.tk_pLPmeanMag = gsfTk->getGSFMomentumAtLastPointWeightedMean().mag();
00552 
00553                                         e.tk_petaVXmode = gsfTk->getGSFMomentumAtVertexMode().eta();
00554                                         e.tk_pphiVXmode = gsfTk->getGSFMomentumAtVertexMode().phi();
00555                                         e.tk_pVXmode[0] = gsfTk->getGSFMomentumAtVertexMode().x();
00556                                         e.tk_pVXmode[1] = gsfTk->getGSFMomentumAtVertexMode().y();
00557                                         e.tk_pVXmode[2] = gsfTk->getGSFMomentumAtVertexMode().z();
00558                                         e.tk_pVXmodeMag = gsfTk->getGSFMomentumAtVertexMode().mag();
00559                                         e.tk_petaVXmean = gsfTk->getGSFMomentumAtVertexWeightedMean().eta();
00560                                         e.tk_pphiVXmean = gsfTk->getGSFMomentumAtVertexWeightedMean().phi();
00561                                         e.tk_pVXmean[0] = gsfTk->getGSFMomentumAtVertexWeightedMean().x();
00562                                         e.tk_pVXmean[1] = gsfTk->getGSFMomentumAtVertexWeightedMean().y();
00563                                         e.tk_pVXmean[2] = gsfTk->getGSFMomentumAtVertexWeightedMean().z();
00564                                         e.tk_pVXmeanMag = gsfTk->getGSFMomentumAtVertexWeightedMean().mag();
00565 
00566                                         e.tk_chi2OverDof = gsfTk->getChi2OverDof();
00567                                         e.tk_chi2OverDofBack = gsfTk->getBackwardFitChi2OverDof();
00568                                         e.tk_tkNhits = gsfTk->getNumberOfHits();
00569                                         e.tk_tkNLostHits = gsfTk->getNumberOfLostHits();
00570                                         e.tk_chargeRec = gsfTk->getCharge();
00571                                         e.tk_highestWeightFP = gsfTk->getHighestWeightAtFirstPoint();
00572                                         e.tk_highestWeightLP = gsfTk->getHighestWeightAtLastPoint();
00573                                         e.tk_highestWeightVX = gsfTk->getHighestWeightAtVertex();
00574 
00575                                         // vertex info
00576                                         XANAVertex *vtx = gsfTk->getVertex();
00577                                         if (vtx!=NULL) {
00578                                                 e.vx_x[0]         = vtx->getPosition().x();
00579                                                 e.vx_x[1]         = vtx->getPosition().y();
00580                                                 e.vx_x[2]         = vtx->getPosition().z();
00581                                                 e.vx_xeDiag[0]    = vtx->getPositionErrorDiag().x();
00582                                                 e.vx_xeDiag[1]    = vtx->getPositionErrorDiag().y();
00583                                                 e.vx_xeDiag[2]    = vtx->getPositionErrorDiag().z();
00584                                                 e.vx_xeOffDiag[0] = vtx->getPositionErrorOffDiag().x();
00585                                                 e.vx_xeOffDiag[1] = vtx->getPositionErrorOffDiag().y();
00586                                                 e.vx_xeOffDiag[2] = vtx->getPositionErrorOffDiag().z();
00587                                                 e.vx_chi2         = vtx->getChi2();
00588                                                 e.vx_chi2Norm     = vtx->getNormalizedChi2();
00589                                                 e.vx_Ndof         = (int)vtx->getNdof();
00590                                                 e.vx_vectSum[0]   = vtx->getVectorialSum().x();
00591                                                 e.vx_vectSum[1]   = vtx->getVectorialSum().y();
00592                                                 e.vx_vectSum[2]   = vtx->getVectorialSum().z();
00593                                                 // is there a refitted track?
00594                                                 
00595                                         }
00596 
00597                                         // electron candidate variables
00598                                         e.el_iel=0;
00599                                         XANAElectronCandidate *elCan1 = xsc->getElectronCandidate();
00600                                         XANAElectronCandidate *elCan  = gsfTk->getElectronCandidate();
00601                                         if (elCan1==elCan && elCan!=NULL) {
00602                                                 e.el_iel        = 1;
00603                                                 e.el_phi     = elCan->getPhi();
00604                                                 e.el_eta     = elCan->getEta();
00605                                                 e.el_pVX[0]  = elCan->getMomentumAtVertex().x();
00606                                                 e.el_pVX[1]  = elCan->getMomentumAtVertex().y();
00607                                                 e.el_pVX[2]  = elCan->getMomentumAtVertex().z();
00608                                                 e.el_pVXMag  = elCan->getMomentumAtVertex().mag();
00609                                                 e.el_pTVX    = elCan->getPt();
00610 
00611                                                 e.el_DetaScTkVx   = elCan->getDeltaEtaSuperClusterAtVtx();
00612                                                 e.el_DetaScTkEc   = elCan->getDeltaEtaSuperClusterAtCalo();
00613                                                 e.el_DetaSeedTkEc = elCan->getDeltaEtaSeedClusterAtCalo();
00614                                                 e.el_DphiScTkVx   = elCan->getDeltaEtaSuperClusterAtVtx();
00615                                                 e.el_DphiScTkEc   = elCan->getDeltaEtaSuperClusterAtCalo();
00616                                                 e.el_DphiSeedTkEc = elCan->getDeltaEtaSeedClusterAtCalo();
00617 
00618                                                 e.el_tkIso   = elCan->getTrackIsolation();
00619                                                 e.el_ecIso   = elCan->getCaloIsolation();
00620                                                 e.el_EOP     = elCan->getESuperClusterOverP();
00621                                                 e.el_EseedOP = elCan->getESeedClusterOverP();
00622                                                 e.el_HOE     = elCan->getHadronicOverEm();
00623                                         }
00624 
00625                                         tree->Fill();
00626                                         ifilled=1;
00627                                         k.ifirst=1;
00628                                         //printf("filling @ tracks %f %d\n",e.etaKine-e.scEta,e.isc);
00629                                 }
00630                                 if (!tkList.size()) {
00631                                         tree->Fill();
00632                                         ifilled=1;
00633                                         k.ifirst=1;
00634                                         //printf("filling @ SC %f %d\n",e.etaKine-e.scEta,e.isc);
00635                                 }
00636                         }
00637                         if (!e.sc_nsc) {
00638                                 tree->Fill();
00639                                 //printf("filling @ genpart %f %d\n",e.etaKine-e.scEta,e.isc);
00640                         }
00641                         event->clear(); 
00642                         geantEvent->clear();
00643                         generatorEvent->clear();
00644                 }
00645                 F->Close();
00646                 delete F;
00647         }
00648 
00649         cout << endl;
00650         cout << e.ievent << " events and " << nb << " bytes read " << endl;
00651         cout << endl;
00652 
00653         fout->Write();
00654         fout->Close();
00655         return 0;
00656 }
00657 
00658 
00659 /*
00660  * functions
00661  */
00662 void kineReset(simpleGeneratorEvent *k) {
00663         k->ifirst=k->nple=0;
00664         for (int i=0; i<10; i++) {
00665                 for (int j=0; j<4; j++) {
00666                         k->x[i][j]=0;
00667                         k->p[i][j]=0;
00668                 }
00669                 k->pid[i]=k->mom[i]=0;
00670                 k->pMag[i]=k->pT[i]=k->eta[i]=k->phi[i]=0;
00671         }
00672         k->mH=k->mZ1=k->mZ2=0;
00673 }
00674 
00675 
00676 void globalReset(simpleEvent *e)
00677 {
00678         e->kn_pid=0;
00679         e->kn_E=e->kn_pT=e->kn_eta=e->kn_phi=0;
00680         e->kn_pMag=0;
00681         //e->isc=e->nsc=0;
00682         e->sc_Erec=e->sc_ErecUncorr=e->sc_ErecScaleFactor=0;
00683         e->sc_ErecS1=e->sc_ErecS4=e->sc_ErecS9=e->sc_ErecS25=0;
00684         e->sc_eta=e->sc_phi=0;
00685         e->sc_seedE=e->sc_seedEta=e->sc_seedPhi=0;
00686         e->sc_seedNxtals=e->sc_seedNxtals2sigma=0;
00687         e->sc_nBrems=0;
00688         e->sc_bremEtot=0;
00689         e->sc_bremNxtals=e->sc_bremNxtals2sigma=0;
00690         e->tk_ntk=e->tk_itk=0;
00691         e->tk_xetaFP=e->tk_xphiFP=0;
00692         e->tk_xetaLP=e->tk_xphiLP=0;
00693         e->tk_petaFPmode=e->tk_pphiFPmode=0;
00694         e->tk_pFPmodeMag=0;
00695         e->tk_petaFPmean=e->tk_pphiFPmean=0;
00696         e->tk_pFPmeanMag=0;
00697         e->tk_petaLPmode=e->tk_pphiLPmode=0;
00698         e->tk_pLPmodeMag=0;
00699         e->tk_petaLPmean=e->tk_pphiLPmean=0;
00700         e->tk_pLPmeanMag=0;
00701         e->tk_petaVXmode=e->tk_pphiVXmode=0;
00702         e->tk_pVXmodeMag=0;
00703         e->tk_petaVXmean=e->tk_pphiVXmean=0;
00704         e->tk_pVXmeanMag=0;
00705         e->tk_tkNhits=e->tk_tkNLostHits=0;
00706         e->tk_chi2OverDof=e->tk_chi2OverDofBack=0;
00707         e->tk_chargeRec=0;
00708         e->tk_highestWeightFP=e->tk_highestWeightLP=e->tk_highestWeightVX=0;
00709         e->vx_chi2=0;
00710         e->vx_chi2Norm=0;
00711         e->vx_Ndof=0;
00712         e->el_phi=0;
00713         e->el_eta=0;
00714         e->el_pVXMag=0;
00715         e->el_pTVX=0;
00716         e->el_pECMag=0;
00717         e->el_DetaScTkVx=0;
00718         e->el_DetaScTkEc=0;
00719         e->el_DetaSeedTkEc=0;
00720         e->el_DphiScTkVx=0;
00721         e->el_DphiScTkEc=0;
00722         e->el_DphiSeedTkEc=0;
00723         e->el_tkIso=0;
00724         e->el_ecIso=0;
00725         e->el_EOP=0;
00726         e->el_EseedOP=0;
00727         e->el_HOE=0;
00728 
00729         e->kn_deltaR=0;
00730         for (int i=0; i<10; i++) {
00731                 if (i<4) {
00732                         e->kn_x[i]=0;
00733                         e->kn_p[i]=0;
00734                 }
00735                 if (i<3) {
00736                         e->tk_xFP[i]=0;
00737                         e->tk_xLP[i]=0;
00738                         e->tk_pFPmode[i]=0;
00739                         e->tk_pFPmean[i]=0;
00740                         e->tk_pLPmode[i]=0;
00741                         e->tk_pLPmean[i]=0;
00742                         e->tk_pVXmode[i]=0;
00743                         e->tk_pVXmean[i]=0;
00744                         e->el_pVX[i]=0;
00745                         e->el_pEC[i]=0;
00746                         e->vx_x[i]=0;
00747                         e->vx_xeDiag[i]=0;
00748                         e->vx_xeOffDiag[i]=0;
00749                         e->vx_vectSum[i]=0;
00750                 }
00751         }
00752 }
00753 
00754 
00755 int mom(int idx, TObjArray *tracks)
00756 {
00757         int pid=0;
00758         while (idx>0) {
00759                 XANAGeantTrack *gtmp = (XANAGeantTrack*)(*tracks)[idx-1];
00760                 idx = gtmp->getMotherIndex();
00761                 pid = gtmp->getPartId();
00762         }
00763         return pid;
00764 }
00765 
00766 
00767 // fixed version: check that in the final vertex there are 2 particles
00768 XANAGeantVertex *getDaughterVertex(XANAGeantTrack *gtk, TObjArray *tracks)
00769 {
00770         for (int i=0; i<tracks->GetEntriesFast(); i++) {
00771                 if (((XANAGeantTrack*)(*tracks)[i])->getMotherIndex()==gtk->getIndex()
00772                                 && ((XANAGeantTrack*)(*tracks)[i])->getVertex()->getNumberOfTracks()==2) {
00773                         return ((XANAGeantTrack*)(*tracks)[i])->getVertex();
00774                 }
00775         }
00776         return NULL;
00777 }

Generated on Thu Oct 27 21:59:45 2005 for XANADOO by doxygen 1.3.5