PREAN/TFndPrean.cxx

00001 // @(#)fROOT/PREAN:$Name:  $:$Id: TFndPrean.cxx,v 1.91 2007/10/02 09:00:08 Diego_Faso Exp $
00002 // Author: Diego Faso <mailto:faso@to.infn.it>, 2005/06/24
00003 
00005 //                                                                             //
00006 //                      PRE-ANALYSIS IMPLEMENTATION                            //
00007 //                                                                             //
00008 //  All operations and calculations required by the preanalysis process are    //
00009 //  implemented in this class:                                                 //
00010 //    1) LUMINOSITY (offline evaluation)                                       //
00011 //    2) HYPERNUCLEI acquisition/reconstruction quality                        //
00012 //    2) BHABHA beam/acquisition/reconstruction quality                        //
00013 //                                                                             //
00014 //  Event buffer,  socket connection, and event processing are handled by the  //
00015 //  preanalysis manger (see TFndPreanMan, daughter of TFndRun).                //
00016 //                                                                             //
00017 //  The ZEBRA structure is accessed through fProcessRec                        //
00018 //  (pointer to TFndProcessRec and data member of TFndRun).                    //
00019 //                                                                             //
00020 //  IMPORTANT NOTE:                                                            //
00021 //    Use of short-tracks, kalman filter, and other setting for fidarc are set //
00022 //    in the TFndProcessRec.h file                                             //
00023 //                                                                             //
00025 
00026 #include <Riostream.h>
00027 #include <TDatime.h>
00028 #include <TMath.h>
00029 #include <TCondition.h>
00030 
00031 #include "TFndEnv.h"
00032 #include "TFndPrean.h"
00033 
00034 #include "TStreamerInfo.h"
00035 
00036 ClassImp(TFndPrean)
00037 
00038 TClonesArray *TFndPrean::fgKminTracks = 0;
00039 TClonesArray *TFndPrean::fgKpluTracks = 0;
00040 TClonesArray *TFndPrean::fgVertices = 0;
00041 
00042 //_____________________________
00043 TFndPrean::TFndPrean(Int_t debug_lev)
00044   : fDebugLev(debug_lev),fTrkStream(-1),
00045     fScalTree(),fGesTree(),fBabaTree(),fBhabhaTree(),fHypeTree(),
00046     fCurPreanFile(),
00047     fCurTrack(),fCurVertex()
00048 {
00049   // default constructor: simply initialize data members
00050 
00051   fForeseenSign[0] = -1;
00052   fForeseenSign[1] =  1;
00053 
00054   if (!fgKminTracks) fgKminTracks = new TClonesArray("TFndTrack",5);
00055   fTracks_Kmin = fgKminTracks;
00056 
00057   if (!fgKpluTracks) fgKpluTracks = new TClonesArray("TFndTrack",5);
00058   fTracks_Kplu = fgKpluTracks;
00059 
00060   if (!fgVertices) fgVertices = new TClonesArray("TFndVertex",4);
00061   fVertices = fgVertices;
00062 
00063 }
00064 
00065 //_____________________________
00066 TFndPrean::~TFndPrean(){
00067   Finish();
00068 
00069   delete fCurTrack;
00070   delete fCurVertex;
00071 
00072   fTracks_Kmin->Delete();
00073   fTracks_Kplu->Delete();
00074   fVertices->Delete();
00075 
00076   delete fScalTree;
00077   delete fGesTree;
00078   delete fBabaTree;
00079   delete fBhabhaTree;
00080   delete fHypeTree;
00081 
00082 }
00083 
00084 //_____________________________
00085 void TFndPrean::Init(Bool_t is_online){
00086   // Initialize all preanalysis processes
00087 
00088 
00089   // --- old stuff
00090   //   TFndEnv *env = TFndEnv::Instance();
00091   //   fPathDafne = env->GetValue("froot.PreAnalysis.PathDafne", "/data02/fnddafne", "FND_PREAN_SHR");
00092   //   if(fDebugLev) Info("Init", "FND_PREAN_SHR is \"%s\"", fPathDafne.Data());  
00093   // ---
00094 
00095   fIsOnline = is_online;
00096   fTrkStream = -1;
00097   //
00098   fCurTrack = new TFndTrack();
00099   fCurVertex = new TFndVertex();
00100   //
00101   Reset();
00102   InitTrees();
00103 }
00104 
00105 //_____________________________
00106 void TFndPrean::Reset(){
00107   // empty all trees, reset rates evaluation variables
00108   // no change is applied to current date/time, paths and files (ofstream)
00109   
00110   ResetDataVariables();
00111   
00112   // trees reset
00113   if(fScalTree)   fScalTree->Reset();
00114   if(fGesTree)    fGesTree->Reset();
00115   if(fBabaTree)   fBabaTree->Reset();
00116   if(fBhabhaTree) fBhabhaTree->Reset();
00117   if(fHypeTree)   fHypeTree->Reset();
00118 
00119   // clear track lists
00120   fTracks_Kmin->Clear();
00121   fTracks_Kplu->Clear();
00122   fVertices->Clear();
00123 
00124   fCurTrack->Reset();
00125   fCurVertex->Reset();
00126 
00127   CloseCurrentSourceFile(); // trees (got from file) are deleted automatically
00128 
00129 }
00130 
00131 //_____________________________
00132 void TFndPrean::ResetDataVariables(){
00133   // reset all variables used by trees
00134 
00135   Float_t in_val_floats = -9999.;
00136   Int_t in_val_ints = -9999;
00137   UInt_t in_val_uints = 9999;
00138 
00139   // --- SCALERS tree variables
00140   bzero(fScal0,sizeof(fScal0));
00141   bzero(fScal1,sizeof(fScal1));
00142   bzero(fScal2,sizeof(fScal2));
00143   bzero(fScal3,sizeof(fScal3));
00144   bzero(fScal4,sizeof(fScal4));
00145   
00146   fScalEvNum = in_val_ints;
00147   for(Int_t i=0; i < (Int_t)E_Scal_Inhib_End ; i++){
00148     fScal_Time[i] = in_val_ints;
00149     fScal_HYP[i]  = in_val_ints;
00150     fScal_BHA[i]  = in_val_ints;
00151     fScal_ORtofino_MB[i] = in_val_ints;
00152     fScal_ORtofone[i]    = in_val_ints;
00153   }  
00154   
00155 
00156   // --- GES variables
00157   fGesEvNum    = in_val_ints;
00158   fGesTrigType = in_val_ints;
00159   fGesEvTime   = in_val_uints; // unsigned
00160   fGesNentryBhabha = in_val_ints;
00161   fGesNentryHype = in_val_ints;
00162   // --- BABA tree (not used)
00163 
00164   // --- BHABHA tree variables
00165   fBhaEvNum = -1;
00166 
00167   fForeseenSign[0] = -1;
00168   fForeseenSign[1] =  1;
00169   
00170   fBhaVertImpossible = 1;
00171   fBhaVertDoubtful = 1;
00172   for(Int_t i=0;i<3;i++) fBhaVertPos[i] = in_val_floats;
00173   for(Int_t i=0;i<2;i++){
00174     fBhaMom[i] = in_val_floats;
00175     fBhaIsLong[i] = 0; // this is a boolean variable!
00176     fBhaPipeAngle[i] = in_val_floats;
00177     fBhaTofiTime[i] = in_val_floats;
00178     fBhaTofoTime[i] = in_val_floats;
00179     fBhaTrackLength[i] = in_val_floats;
00180     fBhaGeoPRradius[i] = in_val_floats;
00181     fBhaGeoFitPoint_X[i] = in_val_floats;
00182     fBhaGeoFitPoint_Y[i] = in_val_floats;
00183     fBhaGeoFitPoint_Z[i] = in_val_floats;
00184     fBhaGeoFitDirCos_X[i] = in_val_floats;
00185     fBhaGeoFitDirCos_Y[i] = in_val_floats;
00186     fBhaGeoFitDirCos_Z[i] = in_val_floats;
00187   }
00188   fBhaInvMass_EpluEmin = in_val_floats;
00189   fBhaInvMass_PIpluPImin = in_val_floats;
00190   fBhaTotalMomentum = in_val_floats;
00191   fBhaAngle = in_val_floats;
00192   
00193   // --- HYPE tree variables
00194   fHypEvNum = -1;
00195   fHyp_PattRec_Err = in_val_ints;
00196   for(Int_t i=0;i<3;i++) fHyp_PhiDecayPos[i] = in_val_floats;
00197   for(Int_t i=0;i<2;i++){
00198     //    fHypStopInTgt[i] = 0;
00199     fHypStopID[i] = 0;
00200     fHypStopTgtNum[i] = in_val_ints;
00201     fHypStopVolNum[i] = in_val_ints;
00202 
00203     fHyp_K_StopPoint_X[i] = in_val_floats;
00204     fHyp_K_StopPoint_Y[i] = in_val_floats;
00205     fHyp_K_StopPoint_Z[i] = in_val_floats;
00206 
00207     fHyp_K_DeDx_Isi[i] = in_val_floats;
00208     fHyp_K_Vert_Center_X[i] = in_val_floats;
00209     fHyp_K_Vert_Center_Y[i] = in_val_floats;
00210     fHyp_K_Vert_Radius[i] = in_val_floats;
00211   }
00212 
00213   // clear track and vertices lists
00214   fCurTrack->Reset();
00215   fCurVertex->Reset();
00216 
00217   fTracks_Kmin->Clear();
00218   fTracks_Kplu->Clear();
00219   fVertices->Clear();
00220   
00221 }
00222 
00223 //_____________________________
00224 void TFndPrean::AddTrack(Int_t part_id){
00225 
00226   E_FinPhys_HypePart_ID prt = (E_FinPhys_HypePart_ID) part_id;
00227 
00228   TClonesArray *selected_array;
00229 
00230   switch(prt){
00231   case FPh_HypKmin_id:
00232     selected_array = fTracks_Kmin;
00233     break;
00234   case FPh_HypKplu_id:
00235     selected_array = fTracks_Kplu;
00236     break;
00237   default: 
00238     Error("AddTrack","part_id = \"%i\" not accepted! BUG!",part_id);
00239     TerminateFroot();
00240     fCurTrack = 0;
00241     break;
00242   }
00243   
00244   Int_t last_id = selected_array->GetEntries();
00245   TClonesArray &tmp_container = *selected_array;
00246   fCurTrack = new(tmp_container[last_id]) TFndTrack();
00247 
00248   return;
00249 }
00250 
00251 //_____________________________
00252 void TFndPrean::AddVertex(){
00253   
00254   Int_t last_id = fVertices->GetEntries();
00255   TClonesArray &tmp_container = *fVertices;
00256   fCurVertex = new(tmp_container[last_id]) TFndVertex();
00257   
00258   return;
00259 }
00260 
00261 //_____________________________
00262 void TFndPrean::InitTrees(){
00263   // create all trees and assign branches to variables
00264 
00265   // SCALERS tree: tree filled with the content of scalers (raw-data)
00266   fScalTree = new TTree("prean_scal_tree","SCALERS Preanalysis tree");
00267   //
00268   fScalTree->Branch("ev_num",&fScalEvNum,"/I");
00269   fScalTree->Branch("time",fScal_Time,"[3]/I");
00270   fScalTree->Branch("hyp",fScal_HYP,"[3]/I");
00271   fScalTree->Branch("bha",fScal_BHA,"[3]/I");
00272   fScalTree->Branch("or_tofino_mb",fScal_ORtofino_MB,"[3]/I");
00273   fScalTree->Branch("or_tofone",fScal_ORtofone,"[3]/I");
00274   
00275   // GES tree: tree filled with general information about the event
00276   //   (GES: Global Event Structure)
00277   fGesTree = new TTree("prean_ges_tree","GES Preanalysis tree");
00278   //
00279   fGesTree->Branch("ev_num",&fGesEvNum,"/I");
00280   fGesTree->Branch("trig_type",&fGesTrigType,"/I");
00281   fGesTree->Branch("ev_time",&fGesEvTime,"/i");
00282   fGesTree->Branch("bhabha_entry",&fGesNentryBhabha,"/I");
00283   fGesTree->Branch("hype_entry",&fGesNentryHype,"/I");
00284 
00285   // Baba tree : tree filled by baba reconstruction process (single helix reconstruction)
00286   fBabaTree = new TTree("prean_baba_tree","BABA Preanalysis tree (single helix)");
00287   
00288   // Bhabha tree : tree filled by bhabha reconstruction process (double helix reconstruction)
00289   fBhabhaTree = new TTree("prean_bhabha_tree","BHABHA Preanalysis tree (double helix)");
00290   //
00291   fBhabhaTree->Branch("ev_num",&fBhaEvNum,"/I");
00292   fBhabhaTree->Branch("vert_impossible",&fBhaVertImpossible,"/O");
00293   fBhabhaTree->Branch("vert_doubtful",&fBhaVertDoubtful,"/O");
00294   fBhabhaTree->Branch("vert_pos",fBhaVertPos,"[3]/F");
00295   //
00296   fBhabhaTree->Branch("part_mom",fBhaMom,"[2]/F");
00297   //
00298   fBhabhaTree->Branch("part_pipe_x",fBhaPipe_X,"[2]/F");
00299   fBhabhaTree->Branch("part_pipe_y",fBhaPipe_Y,"[2]/F");
00300   fBhabhaTree->Branch("part_pipe_z",fBhaPipe_Z,"[2]/F");
00301   //
00302   fBhabhaTree->Branch("part_cdx",fBhaDirCos_X,"[2]/F");
00303   fBhabhaTree->Branch("part_cdy",fBhaDirCos_Y,"[2]/F");
00304   fBhabhaTree->Branch("part_cdz",fBhaDirCos_Z,"[2]/F");
00305   //
00306   fBhabhaTree->Branch("long_trk",fBhaIsLong,"[2]/O");
00307   fBhabhaTree->Branch("pipe_angle",fBhaPipeAngle,"[2]/F");
00308   // ---
00309   fBhabhaTree->Branch("tofino_time",fBhaTofiTime,"[2]/F"); // version >= 9.00/01
00310   fBhabhaTree->Branch("tofone_time",fBhaTofoTime,"[2]/F"); // version >= 9.00/01
00311   fBhabhaTree->Branch("track_length",fBhaTrackLength,"[2]/F"); // version >= 9.00/02
00312   // ---
00313   fBhabhaTree->Branch("inv_mass_e_e",&fBhaInvMass_EpluEmin,"/F");
00314   fBhabhaTree->Branch("inv_mass_pi_pi",&fBhaInvMass_PIpluPImin,"/F");
00315   fBhabhaTree->Branch("tot_mom",&fBhaTotalMomentum,"/F");
00316   fBhabhaTree->Branch("tracks_ang",&fBhaAngle,"/F");
00317 
00318   // added after version 9.00/02
00319   fBhabhaTree->Branch("pr_radius",fBhaGeoPRradius,"[2]/F"); // version >= 9.00/02
00320   fBhabhaTree->Branch("fit_point_x",fBhaGeoFitPoint_X,"[2]/F"); // version >= 9.00/02
00321   fBhabhaTree->Branch("fit_point_y",fBhaGeoFitPoint_Y,"[2]/F"); // version >= 9.00/02
00322   fBhabhaTree->Branch("fit_point_z",fBhaGeoFitPoint_Z,"[2]/F"); // version >= 9.00/02
00323   fBhabhaTree->Branch("fit_dircos_x",fBhaGeoFitDirCos_X,"[2]/F"); // version >= 9.00/02
00324   fBhabhaTree->Branch("fit_dircos_y",fBhaGeoFitDirCos_Y,"[2]/F"); // version >= 9.00/02
00325   fBhabhaTree->Branch("fit_dircos_z",fBhaGeoFitDirCos_Z,"[2]/F"); // version >= 9.00/02
00326   
00327   // Hype tree : tree filled by hype reconstruction process (full reconstruction)
00328   fHypeTree = new TTree("prean_hype_tree","HYPE Preanalysis tree (full reconstruction)");  
00329   //
00330   fHypeTree->Branch("ev_num",&fHypEvNum,"/I");
00331   fHypeTree->Branch("patt_rec_err",&fHyp_PattRec_Err,"/I");
00332   fHypeTree->Branch("phi_decay_pos",fHyp_PhiDecayPos,"[3]/F");
00333   //
00334   fHypeTree->Branch("stop_id",fHypStopID,    "[2]/I");
00335   fHypeTree->Branch("stop_tgt_num",fHypStopTgtNum,    "[2]/I");
00336   fHypeTree->Branch("stop_vol_num",fHypStopVolNum,    "[2]/I");
00337   //
00338   fHypeTree->Branch("part_stop_x", fHyp_K_StopPoint_X,"[2]/F");
00339   fHypeTree->Branch("part_stop_y", fHyp_K_StopPoint_Y,"[2]/F");
00340   fHypeTree->Branch("part_stop_z", fHyp_K_StopPoint_Z,"[2]/F");
00341   //
00342   fHypeTree->Branch("part_dedx_isi",fHyp_K_DeDx_Isi,"[2]/F");
00343   //
00344   fHypeTree->Branch("KminTracks","TClonesArray",&fTracks_Kmin); // version >= 9.00/01
00345   fHypeTree->Branch("KpluTracks","TClonesArray",&fTracks_Kplu); // version >= 9.00/01
00346   fHypeTree->Branch("Vertices","TClonesArray",&fVertices); // version >= 9.01/02
00347   // added after version 9.00/02
00348   fHypeTree->Branch("part_v_center_x",fHyp_K_Vert_Center_X,"[2]/F"); // version >= 9.00/02
00349   fHypeTree->Branch("part_v_center_y",fHyp_K_Vert_Center_Y,"[2]/F"); // version >= 9.00/02
00350   fHypeTree->Branch("part_v_radius",fHyp_K_Vert_Radius,"[2]/F"); // version >= 9.00/02
00351   
00352 }
00353 
00354 //____________________________
00355 Int_t TFndPrean::LoadTrees(const TString &fnam){
00356   // return value:
00357   //              0: ok (all trees loaded)
00358   //             -1: file not found
00359   //             -2: problems while getting trees from file
00360  
00361   if(gSystem->AccessPathName(fnam) == 1){
00362     if(fDebugLev>=1) Warning("LoadTrees","file \"%s\" not found",fnam.Data());
00363     return -1;
00364   }
00365 
00366   CloseCurrentSourceFile(); // not really needed, but safe
00367   fCurPreanFile = new TFile(fnam,"OPEN");
00368 
00369   // --- check streamer version
00370   TList *lisstr = fCurPreanFile->GetStreamerInfoList();
00371   TStreamerInfo *infstr = (TStreamerInfo *)(lisstr->FindObject("TFndTrack"));
00372   if(infstr) fTrkStream =  infstr->GetClassVersion();
00373 
00374   //
00375   if(fDebugLev>=2)
00376     Printf("TFndPrean::Reading file \"%s\" (compression level is: %d)",fCurPreanFile->GetName(),fCurPreanFile->GetCompressionLevel());
00377   else if(fDebugLev==1)
00378     Printf("TFndPrean::Reading file \"%s\"",fCurPreanFile->GetName());
00379   else{
00380     TString r_nam = fnam;
00381     r_nam.Remove(0,r_nam.Sizeof()-21);
00382     r_nam.Resize(r_nam.Sizeof()-12);
00383     //    Printf("Reading run \"%s\"",r_nam.Data());
00384   }
00385   //
00386   
00387   fScalTree   = (TTree *) fCurPreanFile->Get("prean_scal_tree");
00388   fGesTree    = (TTree *) fCurPreanFile->Get("prean_ges_tree");
00389   fBabaTree   = (TTree *) fCurPreanFile->Get("prean_baba_tree");
00390   fBhabhaTree = (TTree *) fCurPreanFile->Get("prean_bhabha_tree");
00391   fHypeTree   = (TTree *) fCurPreanFile->Get("prean_hype_tree");  
00392 
00393   // ---
00394   if(!fScalTree && !fGesTree && !fBabaTree && !fBhabhaTree && !fHypeTree) return -2;
00395 
00396   // --- assign branches to scalers tree
00397   if(fScalTree){
00398     if( fScalTree->GetBranch("ev_num") ) fScalTree->SetBranchAddress("ev_num",&fScalEvNum);
00399     if( fScalTree->GetBranch("time") ) fScalTree->SetBranchAddress("time",fScal_Time);
00400     if( fScalTree->GetBranch("hyp") ) fScalTree->SetBranchAddress("hyp",fScal_HYP);
00401     if( fScalTree->GetBranch("bha") ) fScalTree->SetBranchAddress("bha",fScal_BHA);
00402     if( fScalTree->GetBranch("or_tofino_mb") ) fScalTree->SetBranchAddress("or_tofino_mb",fScal_ORtofino_MB);
00403     if( fScalTree->GetBranch("or_tofone") ) fScalTree->SetBranchAddress("or_tofone",fScal_ORtofone);
00404   }
00405 
00406   // --- assign branches to ges tree
00407   if(fGesTree){
00408     if( fGesTree->GetBranch("ev_num") )    fGesTree->SetBranchAddress("ev_num",&fGesEvNum);
00409     if( fGesTree->GetBranch("trig_type") ) fGesTree->SetBranchAddress("trig_type",&fGesTrigType);
00410     if( fGesTree->GetBranch("ev_time") )   fGesTree->SetBranchAddress("ev_time",&fGesEvTime);
00411     if( fGesTree->GetBranch("bhabha_entry") ) fGesTree->SetBranchAddress("bhabha_entry",&fGesNentryBhabha);
00412     if( fGesTree->GetBranch("hype_entry") ) fGesTree->SetBranchAddress("hype_entry",&fGesNentryHype);
00413   }
00414   
00415   // --- assign branches to bhabha tree
00416   if(fBhabhaTree){
00417     if( fBhabhaTree->GetBranch("ev_num") )fBhabhaTree->SetBranchAddress("ev_num",&fBhaEvNum);
00418     fBhabhaTree->SetBranchAddress("vert_impossible",&fBhaVertImpossible);
00419     fBhabhaTree->SetBranchAddress("vert_doubtful",&fBhaVertDoubtful);
00420     fBhabhaTree->SetBranchAddress("vert_pos",fBhaVertPos);
00421     
00422     fBhabhaTree->SetBranchAddress("part_mom",fBhaMom);
00423     
00424     if( fBhabhaTree->GetBranch("part_pipe_x") ) fBhabhaTree->SetBranchAddress("part_pipe_x",fBhaPipe_X);
00425     if( fBhabhaTree->GetBranch("part_pipe_y") ) fBhabhaTree->SetBranchAddress("part_pipe_y",fBhaPipe_Y);
00426     if( fBhabhaTree->GetBranch("part_pipe_z") ) fBhabhaTree->SetBranchAddress("part_pipe_z",fBhaPipe_Z);
00427     
00428     fBhabhaTree->SetBranchAddress("part_cdx",fBhaDirCos_X);
00429     fBhabhaTree->SetBranchAddress("part_cdy",fBhaDirCos_Y);
00430     fBhabhaTree->SetBranchAddress("part_cdz",fBhaDirCos_Z);
00431     
00432     fBhabhaTree->SetBranchAddress("long_trk",fBhaIsLong);
00433     fBhabhaTree->SetBranchAddress("pipe_angle",fBhaPipeAngle);
00434     
00435     // --- BHABHA TOF time added after version 9.00/01
00436     if( fBhabhaTree->GetBranch("tofino_time") ) fBhabhaTree->SetBranchAddress("tofino_time",fBhaTofiTime);
00437     if( fBhabhaTree->GetBranch("tofone_time") ) fBhabhaTree->SetBranchAddress("tofone_time",fBhaTofoTime);
00438     if( fBhabhaTree->GetBranch("track_length") ) fBhabhaTree->SetBranchAddress("track_length",fBhaTrackLength); // version >= 9.00/02
00439     
00440     fBhabhaTree->SetBranchAddress("inv_mass_e_e",&fBhaInvMass_EpluEmin);
00441     fBhabhaTree->SetBranchAddress("inv_mass_pi_pi",&fBhaInvMass_PIpluPImin);
00442     fBhabhaTree->SetBranchAddress("tot_mom",&fBhaTotalMomentum);
00443     fBhabhaTree->SetBranchAddress("tracks_ang",&fBhaAngle);
00444     // // version >= 9.00/02
00445     if( fBhabhaTree->GetBranch("pr_radius") ) fBhabhaTree->SetBranchAddress("pr_radius",fBhaGeoPRradius);
00446     if( fBhabhaTree->GetBranch("fit_point_x") ) fBhabhaTree->SetBranchAddress("fit_point_x",fBhaGeoFitPoint_X);
00447     if( fBhabhaTree->GetBranch("fit_point_y") ) fBhabhaTree->SetBranchAddress("fit_point_y",fBhaGeoFitPoint_Y);
00448     if( fBhabhaTree->GetBranch("fit_point_z") ) fBhabhaTree->SetBranchAddress("fit_point_z",fBhaGeoFitPoint_Z);
00449     if( fBhabhaTree->GetBranch("fit_dircos_x") ) fBhabhaTree->SetBranchAddress("fit_dircos_x",fBhaGeoFitDirCos_X);
00450     if( fBhabhaTree->GetBranch("fit_dircos_y") ) fBhabhaTree->SetBranchAddress("fit_dircos_y",fBhaGeoFitDirCos_Y);
00451     if( fBhabhaTree->GetBranch("fit_dircos_z") ) fBhabhaTree->SetBranchAddress("fit_dircos_z",fBhaGeoFitDirCos_Z);
00452   }
00453   
00454   // --- assign branches to hype tree
00455   if(fHypeTree){
00456     if( fHypeTree->GetBranch("ev_num") )fHypeTree->SetBranchAddress("ev_num",&fHypEvNum);
00457     fHypeTree->SetBranchAddress("patt_rec_err",&fHyp_PattRec_Err);
00458     fHypeTree->SetBranchAddress("phi_decay_pos",fHyp_PhiDecayPos);
00459     
00460     //  fHypeTree->SetBranchAddress("stop_in_tgt",fHypStopInTgt);
00461     fHypeTree->SetBranchAddress("stop_id",fHypStopID);
00462     fHypeTree->SetBranchAddress("stop_tgt_num",fHypStopTgtNum);
00463     fHypeTree->SetBranchAddress("stop_vol_num",fHypStopVolNum);
00464     
00465     fHypeTree->SetBranchAddress("part_stop_x",fHyp_K_StopPoint_X);
00466     fHypeTree->SetBranchAddress("part_stop_y",fHyp_K_StopPoint_Y);
00467     fHypeTree->SetBranchAddress("part_stop_z",fHyp_K_StopPoint_Z);
00468     
00469     if(fHypeTree->GetBranch("part_dedx_isi")) fHypeTree->SetBranchAddress("part_dedx_isi",fHyp_K_DeDx_Isi);
00470     // --- tracks added after version 9.00/01
00471     if(fHypeTree->GetBranch("KminTracks")) fHypeTree->SetBranchAddress("KminTracks",&fTracks_Kmin);
00472     if(fHypeTree->GetBranch("KpluTracks")) fHypeTree->SetBranchAddress("KpluTracks",&fTracks_Kplu);
00473     if(fHypeTree->GetBranch("Vertices")) fHypeTree->SetBranchAddress("Vertices",&fVertices); // version >= 9.01/02
00474 
00475     // added after version 9.00/02
00476     if(fHypeTree->GetBranch("part_v_center_x")) fHypeTree->SetBranchAddress("part_v_center_x",fHyp_K_Vert_Center_X);
00477     if(fHypeTree->GetBranch("part_v_center_y")) fHypeTree->SetBranchAddress("part_v_center_y",fHyp_K_Vert_Center_Y);
00478     if(fHypeTree->GetBranch("part_v_radius")) fHypeTree->SetBranchAddress("part_v_radius",fHyp_K_Vert_Radius);
00479   }
00480   
00481   return 0;
00482 }
00483 
00484 //____________________________
00485 Int_t TFndPrean::CloseCurrentSourceFile(){
00486   // return value:
00487   //              0: ok (file closed)
00488   //             -1: no file defined
00489   //             -2: file defined, but already closed
00490   
00491   if(!fCurPreanFile) return -1;
00492   if(!fCurPreanFile->IsOpen()) return -2;
00493   
00494   fCurPreanFile->Close();
00495   delete fCurPreanFile;
00496   fCurPreanFile = 0;  
00497   
00498   return 0;
00499 }
00500 
00501 //_____________________________
00502 void TFndPrean::SetDeamonBehaviour(){
00503   // Set class attributes for using it as a deamon
00504   
00505   fDebugLev = -1; // suppress all outputs
00506 }
00507 
00508 //_____________________________
00509 void TFndPrean::Finish(){
00510   // Perform ending operations for all preanalysis processes
00511   
00512 }
00513 
00514 //_____________________________
00515 Int_t TFndPrean::SaveTrees(TFile *file){
00516   // save all trees to the given root-file
00517   // NOTE: the file is not closed here!
00518   //
00519   // return value:
00520   //              0: ok
00521   //             -1: null pointer received
00522   //             -2: received file is not open
00523   //             -3: received file is not writable
00524 
00525   if(!file){
00526     Error("SaveTrees","null pointer received");
00527     return -1;
00528   }
00529   if(! file->IsOpen()){
00530     Error("SaveTrees","file \"%s\" is not open",file->GetName());
00531     return -2;
00532   }
00533   if(! file->IsWritable()){
00534     Error("SaveTrees","file \"%s\" is not writable",file->GetName());
00535     return -3;
00536   }
00537   
00538   if(!fScalTree || !fGesTree || !fBabaTree || !fBhabhaTree || !fHypeTree){
00539     TerminateFroot(0,"Maybe you have just found a BUG (TFndPrean::SaveTrees)");
00540   }
00541   
00542   file->cd();
00543   //
00544   fScalTree->Write();
00545   fGesTree->Write();
00546   fBabaTree->Write();
00547   fBhabhaTree->Write();
00548   fHypeTree->Write();
00549   //
00550   file->Purge();  
00551   return 0;
00552 }
00553 
00554 //_____________________________
00555 Int_t TFndPrean::GoToEvent(const Int_t &ev_num,Int_t &mode){
00556   // find event "ev_num" in every tree
00557   //  Note: ev_num starts from "1"
00558   //
00559   // "mode" is the type:
00560   //                    -1: Not reconstructed
00561   //                     0: Bhabha
00562   //                     1: Hype
00563   // note that scalers tree is filled with all events
00564   //
00565   // return value:
00566   //               0: ok
00567   //              -1: error
00568 
00569   mode = -1; // means: not reconstructed event
00570   Int_t retval = -1;
00571 
00572   //  Info("GoToEvent","Going to event %d",ev_num);
00573   
00574   // --- scalers
00575   if(fScalTree && fScalTree->GetEntries() && ev_num-1 <= fScalTree->GetEntries() ){
00576     fScalTree->GetEntry(ev_num-1);
00577     //Printf(" -------> fScalEvNum: %d",fScalEvNum);
00578     if(fScalEvNum != ev_num) return -1;
00579     retval = 0;
00580   }
00581   
00582   // --- ges
00583   if(fGesTree && fGesTree->GetEntries() && ev_num-1 <= fGesTree->GetEntries() ){
00584     fGesTree->GetEntry(ev_num-1);
00585     //Printf(" -------> fGesEvNum: %d",fGesEvNum);
00586     if(fGesEvNum != ev_num) return -1;
00587     retval = 0;
00588   }  
00589   //   Printf(" -------> fGesNentryBhabha: %d",fGesNentryBhabha);
00590   //   Printf(" -------> fGesNentryHype: %d",fGesNentryHype);  
00591   
00592   // --- baba foreseen, but not implemented in pre-analysis
00593   
00594   // --- bhabha
00595   if(fBhabhaTree && fBhabhaTree->GetEntries() > 0 && fBhabhaTree->GetEntries() >= fGesNentryBhabha){
00596     fBhabhaTree->GetEntry(fGesNentryBhabha-1);
00597     //Printf(" -------> fBhaEvNum: %d",fBhaEvNum);
00598     if(fBhaEvNum == ev_num){
00599       mode = 0;
00600       retval = 0;
00601     }
00602   }
00603   
00604   // --- hype
00605   if(fHypeTree && fHypeTree->GetEntries() > 0 && fHypeTree->GetEntries() >= fGesNentryHype){
00606     fHypeTree->GetEntry(fGesNentryHype-1);
00607     //Printf(" -------> fHypEvNum: %d",fHypEvNum);
00608     if(fHypEvNum == ev_num){
00609       if(mode != -1){
00610         Error("GoToEvent","can not be both bhabha and hype! (ev: %d)",ev_num);
00611         return -1;
00612       }
00613       mode = 1;
00614       retval = 0;
00615     }
00616   }
00617   
00618   // ---
00619   return retval;  
00620 }
00621 
00622 //_____________________________
00623 void TFndPrean::InspectGES(TFndProcessRec *prec){
00624   
00625   Int_t JFGES = prec->GetJFGES();
00626   if(!JFGES){
00627     if(fCurLogFile) *fCurLogFile << "InspectGES Warning: JFGES=0" << endl;
00628     // Warning("AnalyzeBhabha","JFGES=0");
00629     return;
00630   }
00631   
00632   fGesEvNum = prec->GetIQ(JFGES+2);
00633   fGesTrigType = prec->GetIQ(JFGES+3);
00634   // Type of trigger code   (1): Hypernuclear trigger
00635   //                        (2): Bhabha Trigger
00636   //                        (3): Cosmic ray trigger
00637   //                       (11): Both HYP and BHA bits on
00638   //                             Priority to HYP trigger
00639   //                       (21): Single track (only MC)
00640   
00641   UInt_t rtim = (UInt_t) ( prec->GetIQ(JFGES+4) ); // Unix time of the run
00642   UInt_t etim = (UInt_t) ( prec->GetIQ(JFGES+5) ); // Time of the event from the run start (s)
00643   fGesEvTime = (UInt_t) (rtim + etim);
00644  
00645 }
00646 
00647 //_____________________________
00648 void TFndPrean::UpdateGESTree(){
00649   
00650   if(fBhabhaTree) fGesNentryBhabha = (Int_t)(fBhabhaTree->GetEntries());
00651   if(fHypeTree) fGesNentryHype = (Int_t)(fHypeTree->GetEntries());  
00652   //   Printf("==========> BHA: %d (%d)",(Int_t)fBhabhaTree->GetEntries(),fGesNentryBhabha);
00653   //   Printf("==========> HYP: %d (%d)",(Int_t)fHypeTree->GetEntries(),fGesNentryHype);
00654   
00655   fGesTree->Fill(); 
00656 
00657 }
00658 
00659 //_____________________________
00660 void TFndPrean::ReadScalers(UInt_t *RawEvent){
00661   
00662   // read content of all scalers and evaluate the relative rates
00663   //          GLOBAL EVENT HEADER: see FROOT::E_Fnd_Raw_Header_Struct              
00664   //
00665   //            GTS EVENT BUFFER 
00666   //
00667   //     RawEvent[16+0 =16] -----> EVENT LENGTH = HEADER LENGTH + k (k = number of read data)
00668   //     RawEvent[16+1 =17] -----> EVENT NUMBER (Hardware)
00669   //     RawEvent[16+2 =18] -----> DETECTOR IDENTIFIER (GTS) 
00670   //     RawEvent[16+3 =19] -----> RUN NUMBER
00671   //     RawEvent[16+4 =20] -----> EVENT NUMBER (Software)
00672   //     RawEvent[16+5 =21] -----> HEADER LENGTH (36) 
00673   //
00674   //     RawEvent[16+6 =22] -----> EQUIPMENT  1 POINTER: CORBO
00675   //     RawEvent[16+8 =24] -----> EQUIPMENT  3 POINTER: VME TRIGGER SELECTOR
00676   //     RawEvent[16+9 =25] -----> EQUIPMENT  4 POINTER: VME PATTERN UNIT
00677   //     RawEvent[16+10=26] -----> EQUIPMENT  5 POINTER: VME SCALER
00678   //     RawEvent[16+31=47] -----> EQUIPMENT 26 POINTER: CAMAC TDC (LECROY 2229)
00679   //     RawEvent[16+36=52] -----> FIRST DATUM
00680   //
00681   //     scp=RawEvent[26]+16
00682   //
00683   //     (5) VME SCALER
00684   //      RawEvent[scp+0] ----> length
00685   //      RawEvent[scp+1] ----> scaler V1 config. (cascading)
00686   //      RawEvent[scp+2] ----> MULT 2-7 (HYP)
00687   //      RawEvent[scp+3] ----> MULT 2-7 (BHA)
00688   //      RawEvent[scp+4] ----> BTB-MB
00689   //      RawEvent[scp+5] ----> BTB-EL
00690   //      RawEvent[scp+6] ----> PC (Prompt Coincidence)
00691   //      RawEvent[scp+7] ----> Presc BTB-MB
00692   //      RawEvent[scp+8] ----> OR-MB
00693   //      RawEvent[scp+9] ----> OR-EL
00694   //      RawEvent[scp+10] ---> HYP
00695   //      RawEvent[scp+11] ---> BHA
00696   //      RawEvent[scp+12] ---> Presc BHA
00697   //      RawEvent[scp+13] ---> Presc BTB-EL
00698   //      RawEvent[scp+14] ---> OR-TOFONE
00699   //      RawEvent[scp+15] ---> Presc OR-MB
00700   //      RawEvent[scp+16] ---> Total Triggers
00701   //      RawEvent[scp+17] ---> TIME (100 Hz)
00702   //
00703   //      RawEvent[scp+18] ---> scaler V2 config. (cascading)
00704   //      RawEvent[scp+19] ---> MULT 2-7 (HYP)
00705   //      RawEvent[scp+20] ---> MULT 2-7 (BHA)
00706   //      RawEvent[scp+21] ---> BTB-MB
00707   //      RawEvent[scp+22] ---> BTB-EL
00708   //      RawEvent[scp+23] ---> PC (Prompt Coincidence)
00709   //      RawEvent[scp+24] ---> Presc BTB-MB
00710   //      RawEvent[scp+25] ---> OR-MB
00711   //      RawEvent[scp+26] ---> OR-EL
00712   //      RawEvent[scp+27] ---> HYP
00713   //      RawEvent[scp+28] ---> BHA
00714   //      RawEvent[scp+29] ---> Presc BHA
00715   //      RawEvent[scp+30] ---> Presc BTB-EL
00716   //      RawEvent[scp+31] ---> OR-TOFONE
00717   //      RawEvent[scp+32] ---> Presc OR-MB
00718   //      RawEvent[scp+33] ---> Total Triggers
00719   //      RawEvent[scp+34] ---> TIME (100 Hz)
00720   //
00721   //      RawEvent[scp+35] ---> scaler V3 config (cascading)
00722   //      RawEvent[scp+36] ---> HYP
00723   //      RawEvent[scp+37] ---> BHA
00724   //      RawEvent[scp+38] ---> Presc OR-EL
00725   //      RawEvent[scp+39] ---> BTB-EL
00726   //      RawEvent[scp+40] ---> OR TOFONE
00727   //      RawEvent[scp+41] ---> LASER photodiode
00728   //      RawEvent[scp+42] ---> OR TOFINO
00729   //      RawEvent[scp+43] ---> SC (Slow Coincidence)
00730   //      RawEvent[scp+44] ---> void
00731   //      RawEvent[scp+45] ---> ORTofino*ORTofone
00732   //      RawEvent[scp+46] ---> void
00733   //      RawEvent[scp+47] ---> void
00734   //      RawEvent[scp+48] --->      |canali
00735   //      RawEvent[scp+49] ---> RF/4 |in cascata
00736   //      RawEvent[scp+50] ---> trigger*busy
00737   //      RawEvent[scp+51] ---> TIME (100 Hz)
00738   //
00739   //      RawEvent[scp+52] ---> scaler V4 config (cascading)
00740   //      RawEvent[scp+53] ---> HYP
00741   //      RawEvent[scp+54] ---> BHA
00742   //      RawEvent[scp+55] ---> Presc OR-EL
00743   //      RawEvent[scp+56] ---> BTB-EL
00744   //      RawEvent[scp+57] ---> OR TOFONE
00745   //      RawEvent[scp+58] ---> LASER photodiode
00746   //      RawEvent[scp+59] ---> OR TOFINO
00747   //      RawEvent[scp+60] ---> SC (Slow Coincidence)
00748   //      RawEvent[scp+61] ---> void
00749   //      RawEvent[scp+62] ---> ORTofino*ORTofone
00750   //      RawEvent[scp+63] ---> void
00751   //      RawEvent[scp+64] ---> void
00752   //      RawEvent[scp+65] --->      |canali
00753   //      RawEvent[scp+66] ---> RF/4 |in cascata
00754   //      RawEvent[scp+67] ---> trigger*busy
00755   //      RawEvent[scp+68] ---> TIME (100 Hz)
00756   //
00757   //      RawEvent[scp+69] ---> Scaler TOFINO config (cascading)
00758   //      RawEvent[scp+70] ---> Tofino MT 1
00759   //      RawEvent[scp+71] ---> Tofino MT 2
00760   //      RawEvent[scp+72] ---> Tofino MT 3
00761   //      RawEvent[scp+73] ---> Tofino MT 4
00762   //      RawEvent[scp+74] ---> Tofino MT 5
00763   //      RawEvent[scp+75] ---> Tofino MT 6
00764   //      RawEvent[scp+76] ---> Tofino MT 7
00765   //      RawEvent[scp+77] ---> Tofino MT 8
00766   //      RawEvent[scp+78] ---> Tofino MT 9
00767   //      RawEvent[scp+79] ---> Tofino MT 10
00768   //      RawEvent[scp+80] ---> Tofino MT 11
00769   //      RawEvent[scp+81] ---> Tofino MT 12
00770   //
00771   // --------------------------------------------------------------------------------
00772   // --------------------------------------------------------------------------------
00773   // --------------------------------------------------------------------------------
00774   //
00775   //  Description:
00776   //
00777   // --------------------------------------------------------------------------------
00778   //   - Structure (standard C library <time.h>) used for time management 
00779   //Begin_Html
00780   //   (see <a href="http://www.cplusplus.com/ref/ctime/tm.html">http://www.cplusplus.com/ref/ctime/tm.html</a>)
00781   //End_Html
00782   //     
00783   //
00784   //       typedef struct {
00785   //                       int tm_hour;   /* hour (0 - 23) */
00786   //                       int tm_isdst;  /* daylight saving time enabled/disabled */
00787   //                       int tm_mday;   /* day of month (1 - 31) */
00788   //                       int tm_min;    /* minutes (0 - 59) */
00789   //                       int tm_mon;    /* month (0 - 11 : 0 = January) */
00790   //                       int tm_sec;    /* seconds (0 - 59) */
00791   //                       int tm_wday;   /* Day of week (0 - 6 : 0 = Sunday) */
00792   //                       int tm_yday;   /* Day of year (0 - 365) */
00793   //                       int tm_year;   /* Year less 1900 */
00794   //                      } tm
00795   // --------------------------------------------------------------------------------
00796   //
00798   
00799   if(fDebugLev > 0) cout << "TFndPrean: reading scalers: online flag is " << fIsOnline << endl;
00800   
00801   if(!RawEvent){
00802     Error("ReadScalers","Pointer to the raw event is null! skipping");
00803     return;
00804   }
00805 
00806   fScalEvNum = RawEvent[2];
00807   
00808   TDatime check_evt_time;
00809   check_evt_time.Set(RawEvent[5]+RawEvent[6]);
00810   //  if ( RawEvent[2] % 10 ==0 ) cout << "ReadScalers: getting event: " << RawEvent[2] << " (" << check_evt_time.AsString() << ")"<< endl;
00811   // Now data are stored for rate calculations
00812   UInt_t scp = RawEvent[26] + k_EvHeaderLen;   //scaler pointer
00813   
00814   // --- old "running/stopped/crashed" management
00815   // #ifdef FndPrean_CheckForDaqRunning
00816   //   fScal0[5+13] = RawEvent[15];
00817   // #else
00818   //   fScal0[5+13] = K_DAQ_NotMonitored;
00819   // #endif
00820   
00821   for (UInt_t i=0; i< (Int_t)(E_FndScal_01_Desc_End) ; i++) fScal0[i] = RawEvent[scp+  i + 2];
00822   for (UInt_t i=0; i< (Int_t)(E_FndScal_01_Desc_End) ; i++) fScal1[i] = RawEvent[scp+  i + 19];
00823 
00824   for (UInt_t i=0; i< (Int_t)(E_FndScal_23_Desc_End) ; i++) fScal2[i] = RawEvent[scp+  i + 36];
00825   for (UInt_t i=0; i< (Int_t)(E_FndScal_23_Desc_End) ; i++) fScal3[i] = RawEvent[scp+  i + 53];
00826 
00827   for (UInt_t i=0; i< (Int_t)(E_FndScal_4_Desc_End) ; i++)  fScal4[i] = RawEvent[scp+  i + 70];
00828   
00829   // --- following lines can be uncommented for debugging purposes
00830   //   PrintScaler(0);  
00831   //   PrintScaler(1);  
00832   //   PrintScaler(2);  
00833   //   PrintScaler(3);  
00834   //   PrintScaler(4);  
00835   // ---
00836   
00837   // --- Set scaler data-members (for tree) [fScalEvNum already set]
00838   fScal_Time[E_Scal_Inhib_No ] = fScal2[E_FndScal_23_Desc_Time];
00839   fScal_Time[E_Scal_Inhib_Inj] = fScal0[E_FndScal_01_Desc_Time];
00840   fScal_Time[E_Scal_Inhib_All] = fScal1[E_FndScal_01_Desc_Time];
00841   
00842   fScal_HYP[E_Scal_Inhib_No ] = fScal2[E_FndScal_23_Desc_HYP];
00843   fScal_HYP[E_Scal_Inhib_Inj] = fScal0[E_FndScal_01_Desc_HYP];
00844   fScal_HYP[E_Scal_Inhib_All] = fScal1[E_FndScal_01_Desc_HYP];
00845   
00846   fScal_BHA[E_Scal_Inhib_No ] = fScal2[E_FndScal_23_Desc_BHA];
00847   fScal_BHA[E_Scal_Inhib_Inj] = fScal0[E_FndScal_01_Desc_BHA];
00848   fScal_BHA[E_Scal_Inhib_All] = fScal1[E_FndScal_01_Desc_BHA];
00849   
00850   fScal_ORtofino_MB[E_Scal_Inhib_No ] = fScal2[E_FndScal_23_Desc_OR_TOFI];
00851   fScal_ORtofino_MB[E_Scal_Inhib_Inj] = fScal0[E_FndScal_01_Desc_OR_MB];
00852   fScal_ORtofino_MB[E_Scal_Inhib_All] = fScal1[E_FndScal_01_Desc_OR_MB];
00853   
00854   fScal_ORtofone[E_Scal_Inhib_No ] = fScal2[E_FndScal_23_Desc_OR_TOFO];
00855   fScal_ORtofone[E_Scal_Inhib_Inj] = fScal0[E_FndScal_01_Desc_OR_TOFO];
00856   fScal_ORtofone[E_Scal_Inhib_All] = fScal1[E_FndScal_01_Desc_OR_TOFO];
00857   
00858   // ---
00859   fScalTree->Fill(); 
00860 
00861   return;
00862   
00864   // but it containg the rate evaluation, so I'm keeping it
00865   // as a reference (D. Faso)
00867 
00868 
00869   //  Float_t Tempo = ( (Float_t)(fScal1[17] - fScal0[17]) ) / 100.; // time interval (expressed in seconds)
00870   
00871   //   fDatime.Set(); // needed to evaluate the necessity of updating
00872   //   fConvTime = fDatime.Convert();
00873   
00874   //   if(fDebugLev > -1){  // new day - close old file and open new one
00875   //     cout << "*********************" << endl;
00876   //     cout << "ROOT  time: "  << fConvTime << endl;
00877   //     cout << " --- --- --- --- ---" << endl;
00878   //     cout << "ROOT  Day: "  << (UInt_t) ( ((Float_t) fConvTime) / kSecondsPerDay) << endl;
00879   //     cout << " --- --- --- --- ---" << endl;
00880   //     cout << "ROOT  Fif: "  << (UInt_t) ( ((Float_t) fConvTime) / kLuminInterval) << endl;
00881   //     cout << "*********************" << endl;
00882   //     // ---
00883   //     cout << "*********************" << endl;
00884   //     cout << "ROOT year  = " << fDatime.GetYear()  << endl;
00885   //     cout << "ROOT month = " << fDatime.GetMonth()  << endl;
00886   //     cout << "ROOT day   = " << fDatime.GetDay()  << endl;
00887   //     cout << "*********************" << endl;
00888   //   }
00889   
00890   //   if( (UInt_t) ( (((Float_t) fConvTime) / kSecondsPerDay) ) > fCurDay ) { 
00891   //     fCurDay = (UInt_t)( ((Float_t) fConvTime) / kSecondsPerDay ) ;
00892   
00893   
00894   //   }
00895   
00897   
00898   // file for DAFNE  
00899   //  for (Int_t i=2; i<18; i++)  fScalR[i] = ((Float_t)(fScal1[i]-fScal0[i])) / Tempo;
00900   //  for (Int_t i=19; i<35; i++) fScalR[i] = ((Float_t)(fScal1[i]-fScal0[i])) / Tempo;
00901   //   for (Int_t i=36; i<52; i++)
00902   //     if ((i!=44) && (i!=46) && (i!=47) && (i!=48) && (i!=49))
00903   //       fScalR[i] = ((Float_t)(fScal1[i]-fScal0[i]))/Tempo;
00904   //     else
00905   //       if (i==49)
00906   //    fScalR[i] = ((Float_t) ( ((fScal1[49]+(fScal1[48]*2^32))-(fScal0[49]+(fScal0[48]*2^32))) )) / Tempo;
00907   //   for (Int_t i=53; i<69; i++)
00908   //     if ((i!=61) && (i!=63) && (i!=64) && (i!=65) && (i!=66))
00909   //       fScalR[i] = ((Float_t) (fScal1[i]-fScal0[i]) ) / Tempo;
00910   //     else
00911   //       if (i==66)
00912   //    fScalR[i] = ((Float_t) ((fScal1[66]+(fScal1[65]*2^32))-(fScal0[66]+(fScal0[65]*2^32))) ) / Tempo;
00913   //   for (Int_t i=70; i < K_VmeScalBufLen; i++)
00914   //     fScalR[i] = ((Float_t) (fScal1[i]-fScal0[i]) ) / Tempo;
00915   
00916   //  fBhaCount1[E_count_trigger] += fScal1[11]-fScal0[11];
00917   
00918   // File for DAFNE
00919   //   if ( ( (UInt_t) (((Float_t)fConvTime) / kLuminInterval )) > fLastUpdTimeInt) { 
00920   //     //  if ( ( ((UInt_t)fConvTime) / kLuminInterval ) > fLastUpdTimeInt) { 
00921   //     //    if(fDebugLev > -1) cout << "====================== > for dafne 1" << endl; 
00922   //     fLastUpdTimeInt = (UInt_t) ( ((Float_t) fConvTime) / kLuminInterval );
00923   //     fBhaCount0[E_count_trigger] = fBhaCount1[E_count_trigger];
00924   //     fBhaCount1[E_count_trigger]=0;
00925   //   }
00926   
00927   // --- scalers fast
00928   //   cout << fConvTime << " " << RawEvent[1] << " " << RawEvent[2] 
00929   //             << " " << RawEvent[3] << " " << RawEvent[4] 
00930   //             << " " << fScal1[4] << " " << fScal1[5] << " " << fScal1[8] << " "  << fScal1[9] 
00931   //             << " " << fScal1[11] << " " << fScal1[14] << " " << fScal1[16] << " " << fScal1[17] 
00932   //             << " " << fScal1[70] << " " << fScal1[71] << " " << fScal1[72] << " " << fScal1[73]
00933   //             << " " << fScal1[74] << " " << fScal1[75] << " " << fScal1[76] << " " << fScal1[77]
00934   //             << " " << fScal1[78] << " " << fScal1[79] << " " << fScal1[80] << " " << fScal1[81]
00935   //             << " " << fScal1[5+13] << " " << fBhaCount0[E_count_trigger] << " " << endl;
00936   
00937   
00938   /*
00939     
00940   #ifdef FndPrean_CheckForDaqRunning
00941   Bool_t MustWrite = RawEvent[15] == K_DAQ_Active;
00942   #else
00943   Bool_t MustWrite = kFALSE;
00944   #endif
00945   
00946   
00947   if( !( fConvTime % kLuminInterval) && (fConvTime != fCurTime) || MustWrite) {
00948   //  if( !( fConvTime % kLuminInterval) && (fConvTime != fCurTime) ) {
00949   
00950   // RawEvent[15] meaningful in online mode only: see FROOT.h
00951   // in raw data RawEvent[15] always set to zero
00952   
00953   if(fDebugLev > 1) cout << " ======> CurTime:"<< fCurTime << " ======> fConvTime:"<< fConvTime  << " ======> RawEvent[15]:"<< RawEvent[15] << endl;    
00954   fCurTime = fConvTime;
00955   
00956   // File for DAFNE
00957   //     cout << fConvTime << " " << RawEvent[1] << " " << RawEvent[2] 
00958   //              << " " << RawEvent[3] << " " << RawEvent[4] 
00959   //              << " " << fScal1[4] << " " << fScal1[5] << " " << fScal1[8] << " "  << fScal1[9] 
00960   //              << " " << fScal1[11] << " " << fScal1[14] << " " << fScal1[16] << " " << fScal1[17] 
00961   //              << " " << fScal1[70] << " " << fScal1[71] << " " << fScal1[72] << " " << fScal1[73]
00962   //              << " " << fScal1[74] << " " << fScal1[75] << " " << fScal1[76] << " " << fScal1[77]
00963   //              << " " << fScal1[78] << " " << fScal1[79] << " " << fScal1[80] << " " << fScal1[81]
00964   //              << " " << fScal1[5+13] << " " << fBhaCount0[E_count_trigger] << " " << endl;
00965   
00966   }
00967   */  
00968   
00969   
00970   //   for (Int_t ii=0; ii < K_VmeScalBufLen; ii++){
00971   //     fScal0[ii] = fScal1[ii];
00972   //   }
00973   //  if ( RawEvent[2] % 10 ==0 ) cout << "ReadScalers: last processed event: " << RawEvent[2] << endl;
00974   
00975 }
00976 
00977 //_____________________________
00978 void TFndPrean::PrintScaler(Int_t scal_id){
00979   // scal_id = 0,1,2,3,4
00980   
00981   cout << " ----- ----- ----- ----- ----- -----" << endl;
00982   cout << "   Printing content of scaler " << scal_id << " ( event " << fScalEvNum << ")" << endl;
00983   
00984   if(scal_id == 0 || scal_id ==1){
00985     if(scal_id == 0){
00986       cout << "  (injection inhibit)" << endl;
00987       for(Int_t bit=0; bit< E_FndScal_01_Desc_End; bit++)
00988         cout << GetScal_01_DescName(bit).Data() << " : " <<  fScal0[bit] << endl;
00989     }
00990     else{
00991       cout << "  (inhibit)" << endl;
00992       for(Int_t bit=0; bit< E_FndScal_01_Desc_End; bit++)
00993         cout << GetScal_01_DescName(bit).Data() << " : " <<  fScal1[bit] << endl;
00994     }
00995   }
00996   //
00997   else if(scal_id == 2 || scal_id ==3){
00998     if(scal_id == 2){
00999       cout << "  (no inhibit)" << endl;
01000       for(Int_t bit=0; bit< E_FndScal_23_Desc_End; bit++)
01001         cout << GetScal_23_DescName(bit).Data() << " : " <<  fScal2[bit] << endl;
01002     } 
01003     else{
01004       cout << "  (inhibit)" << endl;
01005       for(Int_t bit=0; bit< E_FndScal_23_Desc_End; bit++)
01006         cout << GetScal_23_DescName(bit).Data() << " : " <<  fScal3[bit] << endl;
01007     } 
01008     
01009   }
01010   //
01011   else if(scal_id == 4){
01012     cout << "  (TOFINO RATES)" << endl;
01013     for(Int_t bit=0; bit< E_FndScal_4_Desc_End; bit++)
01014       cout << GetScal_4_DescName(bit).Data() << " : " <<  fScal4[bit] << endl;
01015   } 
01016   
01017   cout << " ----- ----- ----- ----- ----- -----" << endl;
01018   
01019 }
01020 
01021 
01022 //_____________________________
01023 void TFndPrean::AnalyzeBhabha(TFndProcessRec *prec){
01024   // look at fidarc ===> FILLCRBHA1
01025 
01026   Int_t JFDST = prec->GetJFDST();
01027   if(!JFDST){
01028     if(fCurLogFile) *fCurLogFile << "AnalyzeBhabha Warning: JFDST=0" << endl;
01029     // Warning("AnalyzeBhabha","JFDST=0");
01030     return;
01031   }
01032   fBhaEvNum = prec->GetIQ(JFDST+2); // event written  in zebra DST
01033   //  Int_t curev = prec->GetIQ(JFDST+2); // event written  in zebra DST
01034   Int_t ev_time = prec->GetIQ(JFDST+5);
01035   Int_t TrigBit = prec->GetIQ(JFDST+3);
01036 
01037   //  cout << "=============> " << TrigBit << endl;
01038   
01039   // Trigger bit 11 is omitted for now
01040   //   if(TrigBit == 2 || TrigBit == 11){
01041   if(TrigBit != 2) return;
01042   
01043   Int_t LBHA=prec->GetLQ(JFDST-1);
01044   if(!LBHA) return;
01045   
01046   // --- it could seem strange, but the
01047   //     pattern-recognition error code
01048   //     lies inside the noise bank.
01049   Int_t L_NOISE = prec->GetLQ( JFDST - 2);
01050   if(!L_NOISE){
01051     if(fCurLogFile) *fCurLogFile << "AnalyzeBhabha Warning: Noise bank empty (ev " << fBhaEvNum << ")" << endl;
01052     //    Warning("AnalyzeBhabha","Noise bank empty (pattern-recognition error code unknown)");
01053     return;
01054   }
01055   if(prec->GetIQ(L_NOISE+1) != 0) return; // pattern recognition error
01056   
01057   // --- info from bhabha bank
01058   //  
01059   fBhaVertImpossible = (Bool_t)( prec->GetStatusBit(LBHA,1) );
01060   fBhaVertDoubtful = (Bool_t)( prec->GetStatusBit(LBHA,2) );
01061   
01062 
01063   if(fBhaVertImpossible == kFALSE){ // inverted logic according to zebra content
01064     //    cout << "fBhaVertImpossible: " << fBhaVertImpossible << "; fBhaVertDoubtful: "  << fBhaVertDoubtful << endl;
01065     for(Int_t axis=1;axis<=3;axis++){
01066       //cout << "axis " << axis << ": " << prec->GetQ(LBHA + axis) << " ; " ;
01067       fBhaVertPos[axis-1] = prec->GetQ(LBHA + axis);
01068     }
01069     //    cout << endl << endl;
01070   }
01071 
01072 
01073   // No selection (at this level) on vertex determination possibility:
01074   // single tracks will be inspected anyway
01075   
01076   Int_t L_PART = 0; // address of the zebra bank for current particle (e- / e+)
01077   for(Int_t p_i = 0; p_i <= 1; p_i++ ){
01078     // p_i = 1 -> electron (or negative pion from K_short)
01079     // p_i = 2 -> positron (or positive pion from K_short)
01080     L_PART = prec->GetLQ( LBHA - (p_i + 1) );
01081     
01082     while(L_PART){
01083       if(prec->GetIQ(L_PART+1) != fForeseenSign[p_i]){
01084         if(fCurLogFile) *fCurLogFile << "unexpected sign (ev " << fBhaEvNum << "; p_i = " << p_i << ")" << endl;
01085         //      Warning("AnalyzeBhabha","unexpected sign for reconstructed track (p_i = %d)",p_i);
01086         L_PART= prec->GetLQ(L_PART);
01087         continue;
01088       }
01089       
01090       // --- fill variables
01091       fBhaIsLong[p_i] = (Bool_t)( prec->GetStatusBit(L_PART,1) );
01092       fBhaMom[p_i] = prec->GetQ(L_PART+11);
01093       
01094       fBhaPipe_X[p_i] = prec->GetQ(L_PART+30);
01095       fBhaPipe_Y[p_i] = prec->GetQ(L_PART+31);
01096       fBhaPipe_Z[p_i] = prec->GetQ(L_PART+32);
01097 
01098       fBhaDirCos_X[p_i] = prec->GetQ(L_PART+33);
01099       fBhaDirCos_Y[p_i] = prec->GetQ(L_PART+34);
01100       fBhaDirCos_Z[p_i] = prec->GetQ(L_PART+35);
01101       
01102       fBhaPipeAngle[p_i] = prec->GetQ(L_PART+38);
01103       fBhaPipeAngle[p_i] = fBhaPipeAngle[p_i] * TMath::RadToDeg(); // conversion to degrees
01104       
01105       // --- Inspect TOF hits in order to grab time info ( set "fBhaTofiTime" and "fBhaTofoTime")
01106       Int_t L_BHA_TOFI = prec->GetLQ(L_PART - 1);
01107       Int_t L_BHA_TOFO = prec->GetLQ(L_PART - 7);
01108       if(L_BHA_TOFI !=0 && L_BHA_TOFO !=0){
01109         fBhaTofiTime[p_i] = prec->GetQ(L_BHA_TOFI + 14);
01110         fBhaTofoTime[p_i] = prec->GetQ(L_BHA_TOFO + 14);
01111       }
01112       // --- information needed by event-display for displaying tracks
01113       fBhaGeoPRradius[p_i] = prec->GetQ(L_PART + 4);
01114       //
01115       fBhaGeoFitPoint_X[p_i] = prec->GetQ(L_PART + 13);
01116       fBhaGeoFitPoint_Y[p_i] = prec->GetQ(L_PART + 14);
01117       fBhaGeoFitPoint_Z[p_i] = prec->GetQ(L_PART + 15);
01118       //
01119       fBhaGeoFitDirCos_X[p_i] = prec->GetQ(L_PART + 16);
01120       fBhaGeoFitDirCos_Y[p_i] = prec->GetQ(L_PART + 17);
01121       fBhaGeoFitDirCos_Z[p_i] = prec->GetQ(L_PART + 18);
01122 
01123       fBhaTrackLength[p_i] = prec->GetQ(L_PART + 29);
01124       // --- now just check if there is more than one track with the same sign
01125       L_PART= prec->GetLQ(L_PART);
01126       if(L_PART !=0){ 
01127         if(fCurLogFile) *fCurLogFile << "More than one track with the same sign (ev " << fBhaEvNum << "; p_i = " << p_i << ")" << endl;
01128         break; // any unexpected track is not considered
01129       }
01130     }
01131   }
01132 
01133   //--- Now calculations on track attributes will follow
01134   
01135   // total momentum and angle between tracks
01136   if(fBhaVertImpossible == kFALSE){ // inverted logic according to zebra content
01137     Double_t mom_tot = 0; // need a double to use the "ScalarProduct" method
01138     Double_t ang_trks = 0; // need a double to use the "ScalarProduct" method
01139     
01140     Double_t scal_mom = 0; // module of the scalar product
01141     ScalarProduct(fBhaMom[FPh_BhaElec_id],
01142                   fBhaDirCos_X[FPh_BhaElec_id],
01143                   fBhaDirCos_Y[FPh_BhaElec_id],
01144                   fBhaDirCos_Z[FPh_BhaElec_id],
01145                   fBhaMom[FPh_BhaPosit_id],
01146                   fBhaDirCos_X[FPh_BhaPosit_id],
01147                   fBhaDirCos_Y[FPh_BhaPosit_id],
01148                   fBhaDirCos_Z[FPh_BhaPosit_id],
01149                   scal_mom,
01150                   ang_trks
01151                   );
01152     
01153     Double_t cdx_res = 0;
01154     Double_t cdy_res = 0;
01155     Double_t cdz_res = 0;
01156     mom_tot = FIN_PHYS::Sum(fBhaMom[FPh_BhaElec_id],
01157                             fBhaDirCos_X[FPh_BhaElec_id],
01158                             fBhaDirCos_Y[FPh_BhaElec_id],
01159                             fBhaDirCos_Z[FPh_BhaElec_id],
01160                             fBhaMom[FPh_BhaPosit_id],
01161                             fBhaDirCos_X[FPh_BhaPosit_id],
01162                             fBhaDirCos_Y[FPh_BhaPosit_id],
01163                             fBhaDirCos_Z[FPh_BhaPosit_id],
01164                             cdx_res,cdy_res,cdz_res);    
01165     
01166     
01167     fBhaTotalMomentum = (Float_t) mom_tot;
01168     
01169     if(ang_trks != -999) fBhaAngle = (Float_t) (ang_trks * TMath::RadToDeg());
01170     else fBhaAngle = ang_trks;
01171     
01172     // invariant masses (different hypothesis)
01173     fBhaInvMass_EpluEmin =  CenterMassEnergy(FPh_PID_Electron,
01174                                              fBhaMom[FPh_BhaElec_id],
01175                                              fBhaDirCos_X[FPh_BhaElec_id],
01176                                              fBhaDirCos_Y[FPh_BhaElec_id],
01177                                              fBhaDirCos_Z[FPh_BhaElec_id],
01178                                              FPh_PID_Positron,
01179                                              fBhaMom[FPh_BhaPosit_id],
01180                                              fBhaDirCos_X[FPh_BhaPosit_id],
01181                                              fBhaDirCos_Y[FPh_BhaPosit_id],
01182                                              fBhaDirCos_Z[FPh_BhaPosit_id]);
01183     
01184     //  cout << " ===> ee: " << fBhaInvMass_EpluEmin << endl;
01185     
01186     
01187     fBhaInvMass_PIpluPImin =  CenterMassEnergy(FPh_PID_Pi_min,
01188                                                fBhaMom[FPh_BhaElec_id],
01189                                                fBhaDirCos_X[FPh_BhaElec_id],
01190                                                fBhaDirCos_Y[FPh_BhaElec_id],
01191                                                fBhaDirCos_Z[FPh_BhaElec_id],
01192                                                FPh_PID_Pi_plu,
01193                                                fBhaMom[FPh_BhaPosit_id],
01194                                                fBhaDirCos_X[FPh_BhaPosit_id],
01195                                                fBhaDirCos_Y[FPh_BhaPosit_id],
01196                                                fBhaDirCos_Z[FPh_BhaPosit_id]);
01197     
01198     
01199   }
01200   // ---
01201   fBhabhaTree->Fill(); 
01202 }
01203 
01204 //_____________________________
01205 void TFndPrean::AnalyzeHype(TFndProcessRec *prec){
01206   // notes for further developments (Aug 29, 2007 - D. Faso):
01207   //
01208   //  - K vertex check (tracks crossing point inside target)
01209   //    should be added while evaluating stopped K-/K+
01210   //      [ see fidarc->ktrkvert   Q(LLAST+57) = DIFFZ ]
01211   //
01212   //  - Up to now long tracks only are considered:
01213   //    short tracks could be considered.
01214   //    ( it will not be possible to distinguish   )
01215   //    ( different types of short tracks:         )
01216   //    ( for example we could consider all fitted )
01217   //    ( tracks with three or more points.        )
01218 
01219   Int_t JFDST = prec->GetJFDST();
01220   if(!JFDST){
01221     if(fCurLogFile) *fCurLogFile << "AnalyzeHype warning: JFDST=0" << endl;
01222     //    Warning("AnalyzeHype","JFDST=0");
01223     return;
01224   }
01225   fHypEvNum = prec->GetIQ(JFDST+2); // event written  in zebra DST
01226   //  Int_t curev = prec->GetIQ(JFDST+2); // event written  in zebra DST
01227   Int_t ev_time = prec->GetIQ(JFDST+5);
01228   Int_t TrigBit = prec->GetIQ(JFDST+3);
01229   
01230   //  cout << "=============> Current event: " << fHypEvNum << endl; // DEBUGGING
01231   //  cout << "=============> " << TrigBit << endl;
01232   
01233   // this check will always start with trigger bit == 11 will
01234   //   if(TrigBit == 2 || TrigBit == 11){
01235   if(TrigBit != 1 && TrigBit != 11 ) return;
01236   
01237 
01238   //  fHyp_PattRec_Err///////////////////////////////////
01239   Int_t L_NOISE = prec->GetLQ( JFDST - 3);
01240   if(!L_NOISE){
01241     if(fCurLogFile) *fCurLogFile << "AnalyzeHype Warning: Noise bank empty (ev " << fHypEvNum << ")" << endl;
01242     return;
01243   }
01244   fHyp_PattRec_Err = prec->GetIQ(L_NOISE+1); // pattern recognition error-code
01245   
01246   Int_t L_KAON=0;
01247   for(Int_t p_i = 0; p_i <= 1; p_i++ ){
01248     // p_i = 0 -> K-
01249     // p_i = 1 -> K+
01250     L_KAON = prec->GetLQ(JFDST - (p_i + 1) );
01251     
01252     while(L_KAON){
01253 
01254       // --- phi decay position
01255       Bool_t same_point = kTRUE;
01256       if(p_i== 1){ // check if K- and K+ gives the same point for Phi decay
01257         for(Int_t chk=0;chk<3;chk++){
01258           if( prec->GetQ(L_KAON + 12+chk) != fHyp_PhiDecayPos[chk]){
01259             same_point = kFALSE;
01260             break;
01261           }
01262         }
01263       }
01264       if(!same_point){
01265         if(fCurLogFile) *fCurLogFile << "AnalyzeHype warning: Phy decay position different from K- to K+ (ev " << fHypEvNum << ")" << endl;
01266         //Warning("AnalyzeHype","Phy decay position different from K- to K+ (ev %d)",fHypEvNum);
01267         L_KAON= prec->GetLQ(L_KAON);
01268         continue;
01269       }
01270       for(Int_t axis=0;axis<3;axis++) fHyp_PhiDecayPos[axis] = prec->GetQ(L_KAON + 12 + axis);
01271       // --- phi decay position completed
01272 
01273 
01274       // --- kaon stopping point      
01275       //--- stop volume check as in FILLGENHYP (fidarc)
01276       TString Vnam = HolleritToString(prec->GetIQ(L_KAON + 1));
01277       
01278       fHypStopID[p_i] = (Int_t)E_Kaon_Stop_Other;
01279       if(! Vnam.CompareTo("ISIM")) fHypStopID[p_i] = (Int_t) E_Kaon_Stop_Isim;
01280       else if(! Vnam.CompareTo("IGLA")) fHypStopID[p_i] = (Int_t)E_Kaon_Stop_Glass;
01281       else if(! Vnam.CompareTo("IUPL")) fHypStopID[p_i] = (Int_t)E_Kaon_Stop_Upilex;
01282       else if(! Vnam.CompareTo("OSIM")) fHypStopID[p_i] = (Int_t) E_Kaon_Stop_Osim;
01283       else{
01284         Vnam.Resize(3);
01285         if(! Vnam.CompareTo("TAR")) fHypStopID[p_i] = (Int_t)E_Kaon_Stop_Target;
01286       }
01287       
01288       //       cout << "Vnam:        \"" << Vnam << "\"." << endl;
01289       //       cout << "fHypStopID: \"" << fHypStopID[p_i] << "\"." << endl << endl;
01290 
01291       if( fHypStopID[p_i] == (E_Kaon_StopCode)E_Kaon_Stop_Target ||
01292           fHypStopID[p_i] == (E_Kaon_StopCode)E_Kaon_Stop_Isim )
01293         {
01294           fHypStopTgtNum[p_i] = prec->GetIQ(L_KAON + 2);
01295           fHypStopVolNum[p_i] = -1;
01296         }
01297       else{
01298         fHypStopTgtNum[p_i] = -1; 
01299         fHypStopVolNum[p_i] = prec->GetIQ(L_KAON + 2);
01300       }
01301 
01302       // ---
01303       fHyp_K_StopPoint_X[p_i] = prec->GetQ(L_KAON + 5);
01304       fHyp_K_StopPoint_Y[p_i] = prec->GetQ(L_KAON + 6);
01305       fHyp_K_StopPoint_Z[p_i] = prec->GetQ(L_KAON + 7);
01306       // --- kaon stopping point completed
01307       
01308       Int_t L_K_ISIM = prec->GetLQ(L_KAON - 2);
01309       if(L_K_ISIM) fHyp_K_DeDx_Isi[p_i] = prec->GetQ(L_K_ISIM + 11);
01310       
01311       
01313       // single particle (K-/K+) examined (tracks can follow)
01314       // --- tracks inspection (to be implemented)
01315       Int_t L_TRACK=0;
01316       Int_t id_trk = 0; // [0,1,2]: [neg,pos,neut]
01317       TFndTrack *CurTrack = 0;
01318 
01319 
01320       // --- load start time for every track
01321       Int_t L_K_ISLB = prec->GetLQ(L_KAON - 1);
01322       Float_t start_time = 0;
01323       if(L_K_ISLB) start_time = prec->GetQ(L_K_ISLB + 14); // Slab Time, average of Left & Right TDCs (ns)
01324       // ---
01325 
01326       for(id_trk = 0; id_trk<3; id_trk++){
01327         if(p_i == 1 && id_trk == 2) break; // neutral-tracks is void in zebra for K+
01328 
01329         if(fDebugLev>1){ // DEBUGGING
01330           cout << endl << " ...inspecting track-id \"" << id_trk 
01331                << "\"   (part-id: " << p_i 
01332                << "; ev " << fHypEvNum << ")." << endl;
01333         }
01334 
01335         Int_t trk_count = 0;
01336         L_TRACK = prec->GetLQ(L_KAON - 3 -id_trk );
01337         //      Printf("LTRACK = %d",L_TRACK);
01338         
01339         while(L_TRACK){
01340           trk_count++;
01341           AddTrack(p_i);
01342           // single track decoding (fCurTrack is used)
01343 
01344           if(id_trk == 0 || id_trk == 1){ // charged particles
01345             fCurTrack->fCharge = ( id_trk == 0 ) ? -1 : +1;
01346             // now check fit charge result
01347             if(prec->GetIQ(L_TRACK + 7) == TFndTrack::E_Trk_Fit_Success){
01348               Bool_t is_pos = (Bool_t)( prec->GetStatusBit(L_TRACK,7) );
01349               if(id_trk == 0 && is_pos || id_trk == 1 && !is_pos ) {
01350                 fCurTrack->fChargeAmbig = kTRUE;
01351                 //              cout <<" Unexpected charge for rec. trk (ev. " << fHypEvNum  << " ; id: " << id_trk << " ; is_pos: " << is_pos << ")" << endl;
01352                 //
01353                 if(fCurLogFile) *fCurLogFile << " Unexpected sign for rec. trk (ev. " << fHypEvNum
01354                                              << " ; id: " << id_trk << " ; is_pos: " << is_pos << ")" << endl;
01355               }
01356               else fCurTrack->fChargeAmbig = kFALSE; // safe but not mandatory
01357             }
01358             
01359 #ifndef FIDA_USE_SHORT
01360             fCurTrack->fFwd = (Bool_t)( prec->GetStatusBit(L_TRACK,2) );
01361 #endif
01362             // --- from pattern recognition
01363             fCurTrack->fPR_Helix[TFndTrack::E_Hel_Xc] = prec->GetQ(L_TRACK + 1);
01364             fCurTrack->fPR_Helix[TFndTrack::E_Hel_Yc] = prec->GetQ(L_TRACK + 2);
01365             fCurTrack->fPR_Helix[TFndTrack::E_Hel_R] = prec->GetQ(L_TRACK + 3);
01366 #ifdef FIDA_USE_SHORT
01367             fCurTrack->fPR_MomVert[TFndTrack::E_Hel_Mom] = prec->GetQ(L_TRACK + 8);
01368             fCurTrack->fPR_MomVert[TFndTrack::E_Hel_Lam] = prec->GetQ(L_TRACK + 9);
01369             fCurTrack->fPR_MomVert[TFndTrack::E_Hel_Phi] = prec->GetQ(L_TRACK + 10);
01370 #else
01371             // following lines shall be considered deprecated
01372             cout << "ARE YOU SURE YOU DON'T WANT TO USE SHORT_TRACK PROCEDURE?" << endl;
01373             fCurTrack->fPR_MomVert[TFndTrack::E_Hel_Mom] = prec->GetQ(L_TRACK + 4);
01374             fCurTrack->fPR_MomVert[TFndTrack::E_Hel_Lam] = prec->GetQ(L_TRACK + 5);
01375             fCurTrack->fPR_MomVert[TFndTrack::E_Hel_Phi] = prec->GetQ(L_TRACK + 6);
01376 #endif
01377             
01378             // --- from fit
01379             fCurTrack->fStart[TFndTrack::E_Trk_X] = prec->GetQ(L_TRACK + 14);
01380             fCurTrack->fStart[TFndTrack::E_Trk_Y] = prec->GetQ(L_TRACK + 15);
01381             fCurTrack->fStart[TFndTrack::E_Trk_Z] = prec->GetQ(L_TRACK + 16);
01382             fCurTrack->fStart[TFndTrack::E_Trk_cosX] = prec->GetQ(L_TRACK + 17);
01383             fCurTrack->fStart[TFndTrack::E_Trk_cosY] = prec->GetQ(L_TRACK + 18);
01384             fCurTrack->fStart[TFndTrack::E_Trk_cosZ] = prec->GetQ(L_TRACK + 19);
01385 
01386             fCurTrack->fStop[TFndTrack::E_Trk_X] = prec->GetQ(L_TRACK + 20);
01387             fCurTrack->fStop[TFndTrack::E_Trk_Y] = prec->GetQ(L_TRACK + 21);
01388             fCurTrack->fStop[TFndTrack::E_Trk_Z] = prec->GetQ(L_TRACK + 22);
01389             fCurTrack->fStop[TFndTrack::E_Trk_cosX] = prec->GetQ(L_TRACK + 23);
01390             fCurTrack->fStop[TFndTrack::E_Trk_cosY] = prec->GetQ(L_TRACK + 24);
01391             fCurTrack->fStop[TFndTrack::E_Trk_cosZ] = prec->GetQ(L_TRACK + 25);
01392 
01393 #ifndef FIDA_USE_SHORT
01394             cout << "ARE YOU SURE YOU DON'T WANT TO USE SHORT_TRACK PROCEDURE?" << endl;
01395             Bool_t is_long_track = (Bool_t)( prec->GetStatusBit(L_TRACK,1) );
01396             fCurTrack->fNumOfHits = (is_long_track) ? 4 : 3;
01397 #endif
01398             fCurTrack->fFitErr = prec->GetIQ(L_TRACK + 7);
01399             fCurTrack->fLength = prec->GetQ(L_TRACK + 30);
01400             
01401             fCurTrack->fFit_MomVert[TFndTrack::E_Hel_Mom] = prec->GetQ(L_TRACK +  8);
01402             fCurTrack->fFit_MomVert[TFndTrack::E_Hel_Lam] = prec->GetQ(L_TRACK +  9);
01403             fCurTrack->fFit_MomVert[TFndTrack::E_Hel_Phi] = prec->GetQ(L_TRACK + 10);
01404             
01405             fCurTrack->fFit_MomVertErr[TFndTrack::E_Hel_Mom] = prec->GetQ(L_TRACK + 11);
01406             fCurTrack->fFit_MomVertErr[TFndTrack::E_Hel_Lam] = prec->GetQ(L_TRACK + 12);
01407             fCurTrack->fFit_MomVertErr[TFndTrack::E_Hel_Phi] = prec->GetQ(L_TRACK + 13);
01408 
01409             fCurTrack->fChiSq[TFndTrack::E_Trk_ChiSq_DEV] = prec->GetQ(L_TRACK + 26);
01410             fCurTrack->fChiSq[TFndTrack::E_Trk_ChiSq_RES] = prec->GetQ(L_TRACK + 27);
01411             fCurTrack->fChiSq[TFndTrack::E_Trk_ChiSq_LOSTstb] = prec->GetQ(L_TRACK + 28);
01412             fCurTrack->fChiSq[TFndTrack::E_Trk_ChiSq_STEREOstb] = prec->GetQ(L_TRACK + 29);
01413             
01414             // --- from backtracking
01415             fCurTrack->fExtrapolated = (Bool_t)( prec->GetStatusBit(L_TRACK,10) );
01416             fCurTrack->fBackTrack[TFndTrack::E_Trk_Bcktrk_NormAng]          = prec->GetQ(L_TRACK + 31);
01417             fCurTrack->fBackTrack[TFndTrack::E_Trk_Bcktrk_SurfApproach]     = prec->GetQ(L_TRACK + 32);
01418             fCurTrack->fBackTrack[TFndTrack::E_Trk_Bcktrk_MaxApproach]      = prec->GetQ(L_TRACK + 33);
01419             fCurTrack->fBackTrack[TFndTrack::E_Trk_Bcktrk_SurfPlanePath]    = prec->GetQ(L_TRACK + 34);
01420             fCurTrack->fBackTrack[TFndTrack::E_Trk_Bcktrk_ExtrDist]         = prec->GetQ(L_TRACK + 35);
01421             fCurTrack->fBackTrack[TFndTrack::E_Trk_Bcktrk_dPtgt_spline]     = prec->GetQ(L_TRACK + 36);
01422             fCurTrack->fBackTrack[TFndTrack::E_Trk_Bcktrk_dPtgt_spline_cor] = prec->GetQ(L_TRACK + 37);
01423             fCurTrack->fBackTrack[TFndTrack::E_Trk_Bcktrk_pid]              = (Float_t)( prec->GetIQ(L_TRACK + 38) );
01424 
01425             // ---
01426             // Evaluate PATH and ADD time info to "fStart" and "fStop"
01427             
01428             // only the first hit on every detector
01429             // is considered for the required pre-analysis
01430             //   (we need to set path and time)
01431             Int_t L_TRK_ISIM = 0;
01432             Int_t L_TRK_OSIM = 0;
01433             Int_t L_TRK_DCH1 = 0;
01434             Int_t L_TRK_DCH2 = 0;
01435             Int_t L_TRK_TRIT = 0;
01436             Int_t L_TRK_TOFO = 0;
01437 
01438             Int_t pth_tofi = 0; // will not change here (tofino not involved)
01439             Int_t pth_isim = 0; // will not change here (isim not involved)
01440             Int_t pth_osim = 0;
01441             Int_t pth_lmd_inn = 0;
01442             Int_t pth_lmd_out = 0;
01443             Int_t pth_tofo = 0;
01444             
01445             L_TRK_ISIM = prec->GetLQ(L_TRACK - 8);
01446             if(L_TRK_ISIM){
01447               fCurTrack->fDeDx[0] = prec->GetQ(L_TRK_ISIM + 11);
01448               pth_isim =  prec->GetIQ(L_TRK_ISIM + 1);
01449             }
01450             
01451             
01452             L_TRK_OSIM = prec->GetLQ(L_TRACK - 1 );
01453             if(L_TRK_OSIM){
01454               fCurTrack->fDeDx[1] = prec->GetQ(L_TRK_OSIM + 11);
01455               pth_osim = prec->GetIQ(L_TRK_OSIM + 1);
01456               //cout << "OSIM = " << pth_osim << endl;
01457             }
01458             
01459             L_TRK_DCH1 = prec->GetLQ(L_TRACK - 2);
01460             if(L_TRK_DCH1){
01461               pth_lmd_inn = prec->GetIQ(L_TRK_DCH1 + 1);
01462               //cout << "DCH1 = " << pth_lmd_inn << endl;
01463             }
01464 
01465             L_TRK_DCH2 = prec->GetLQ(L_TRACK - 4);
01466             if(L_TRK_DCH2){
01467               pth_lmd_out = prec->GetIQ(L_TRK_DCH2 + 1);
01468               //cout << "DCH2 = " << pth_lmd_out << endl;
01469             }
01470 
01471             // L_TRK_TRIT = prec->GetLQ(L_TRACK - 6); // not needed here
01472 
01473             L_TRK_TOFO = prec->GetLQ(L_TRACK - 7);
01474             if(L_TRK_TOFO){
01475               pth_tofo = prec->GetIQ(L_TRK_TOFO + 1);
01476               //cout << "TOFO = " << pth_tofo << endl;
01477             }
01478 
01479 
01480             fCurTrack->SetPath(pth_tofi, pth_isim, pth_osim, pth_lmd_inn, pth_lmd_out, pth_tofo);
01481             
01482             // TIME
01483             Float_t stop_time = 0;
01484             if(L_TRK_TOFO && start_time){
01485               stop_time = prec->GetQ(L_TRK_TOFO + 14); // Slab Time, average of Left & Right TDCs (ns)
01486               fCurTrack->fStart[TFndTrack::E_Trk_T] = start_time;
01487               fCurTrack-> fStop[TFndTrack::E_Trk_T] = stop_time;
01488               fCurTrack->fTOF = stop_time - start_time;
01489             }
01490             // ---
01492             //      L_TRACK + 39 , 40 ... 52
01493             // --- type (hit layers)
01494 #ifdef FIDA_USE_SHORT
01495             Int_t n_isim = 0;
01496             Int_t n_osim = 0;
01497             Int_t n_lmd_inn = 0;
01498             Int_t n_lmd_out = 0;
01499             Int_t n_stb = 0;
01500             
01501             L_TRK_ISIM = prec->GetLQ(L_TRACK - 8); // not needed here
01502             if(L_TRK_ISIM) do{
01503               n_isim++;
01504               L_TRK_ISIM = prec->GetLQ(L_TRK_ISIM);                    
01505             } while(L_TRK_ISIM);
01506             if(n_isim > 9) n_isim = 9;
01507             //
01508             L_TRK_OSIM = prec->GetLQ(L_TRACK - 1 );
01509             if(L_TRK_OSIM != 0) n_osim = 10;
01510             //
01511             L_TRK_DCH1 = prec->GetLQ(L_TRACK - 2);
01512             if(L_TRK_DCH1 != 0) n_lmd_inn = 100;
01513             //
01514             L_TRK_DCH2 = prec->GetLQ(L_TRACK - 4);
01515             if(L_TRK_DCH2 != 0) n_lmd_out = 1000;
01516             //
01517             L_TRK_TRIT = prec->GetLQ(L_TRACK - 6);
01518             if(L_TRK_TRIT != 0) n_stb = 10000;
01520             fCurTrack->fType = n_isim + n_osim + n_lmd_inn + n_lmd_out + n_stb ;
01521             if(fDebugLev > 0) cout << "EVENT: " << fHypEvNum << endl;
01522             if(fDebugLev > 2) cout << "L_TRACK + 39 ===> " << prec->GetQ(L_TRACK + 39) << endl;
01523             fCurTrack->EvalTrack(); // forward value is also evaluated
01524             fCurTrack->fDistVert = prec->GetQ(L_TRACK + 39);
01525             //
01526             fCurTrack->fIsimCos = prec->GetQ(L_TRACK + 40);
01527             fCurTrack->fOsimCos = prec->GetQ(L_TRACK + 41);
01528             fCurTrack->fLmd1Cos = prec->GetQ(L_TRACK + 42);
01529             fCurTrack->fLmd2Cos = prec->GetQ(L_TRACK + 43);
01530 
01531             // --- SUPPORT for corrected dE/dx (considering track attack-angle)
01532             //
01533             L_TRK_ISIM = prec->GetLQ(L_TRACK - 8);
01534             if(L_TRK_ISIM && fCurTrack->fIsimCos){
01535               fCurTrack->fCorr_DeDx[0] =
01536                 fCurTrack->fIsimCos * ( (prec->GetQ(L_TRK_ISIM+7) + prec->GetQ(L_TRK_ISIM+9)) / 2 );
01537             }
01538             L_TRK_OSIM = prec->GetLQ(L_TRACK - 1);
01539             if(L_TRK_OSIM && fCurTrack->fOsimCos){
01540               fCurTrack->fCorr_DeDx[1] =
01541                 fCurTrack->fOsimCos * ( (prec->GetQ(L_TRK_OSIM+7) + prec->GetQ(L_TRK_OSIM+9)) / 2 );
01542             }
01543             L_TRK_DCH1 = prec->GetLQ(L_TRACK - 2);
01544             if(L_TRK_DCH1 && fCurTrack->fLmd1Cos){
01545               fCurTrack->fCorr_DeDx[2] =
01546                 fCurTrack->fLmd1Cos * ( (prec->GetQ(L_TRK_DCH1+10) + prec->GetQ(L_TRK_DCH1+11)) / 2 );
01547             }
01548             L_TRK_DCH2 = prec->GetLQ(L_TRACK - 4);
01549             if(L_TRK_DCH2 && fCurTrack->fLmd2Cos){
01550               fCurTrack->fCorr_DeDx[3] =
01551                 fCurTrack->fLmd2Cos * ( (prec->GetQ(L_TRK_DCH2+10) + prec->GetQ(L_TRK_DCH2+11)) / 2 );
01552             }
01553             //
01554             // ---
01555             // D. Faso: I'm stopping here ( Oct 2d, 2007 ):
01556             //  Vertex assignment procedure is not completed yet in fidarc.
01557             //
01558             // This section needs to be completed:
01559             //  TFndVertex class and vertices array are ready:
01560             //  Just fill them from zebra as soon as they will be available
01561             //  in fidarc.
01562 #endif
01563 
01564           }
01566           else{ // neutral tracks
01567             fCurTrack->fCharge = 0;
01568             fCurTrack->fTOF = prec->GetQ(L_TRACK + 1);
01569 
01570             fCurTrack->fPR_MomVert[TFndTrack::E_Hel_Mom] = prec->GetQ(L_TRACK + 4);
01571             fCurTrack->fPR_MomVert[TFndTrack::E_Hel_Lam] = prec->GetQ(L_TRACK + 6);
01572             fCurTrack->fPR_MomVert[TFndTrack::E_Hel_Phi] = prec->GetQ(L_TRACK + 7);
01573 
01574             fCurTrack->fEnergy = prec->GetQ(L_TRACK + 5);
01575           }
01576 
01577           // ---
01578           if(fDebugLev>1) { // DEBUGGING print-out
01579             Printf("Event: %i; part_id: %i, trk_id: %i, trk num: %i",fHypEvNum, p_i, id_trk, trk_count);
01580             fCurTrack->PrintData(4);
01581           }
01582           // ---
01583           L_TRACK= prec->GetLQ(L_TRACK);
01584         }
01585         if(fDebugLev>0 && trk_count > 0) cout << "number of tracks = " << trk_count << endl << endl;
01586         // finishing sign (tracks)
01587       }
01588       // --- tracks inspection completed
01589       
01590       // --- GRAV info (geometric information about phi-vertex reconstruction)      
01591       Int_t L_K_GRAV = prec->GetLQ(L_KAON - 6);
01592       if(L_K_GRAV){
01593         fHyp_K_Vert_Center_X[p_i] = prec->GetQ(L_K_GRAV + 1);
01594         fHyp_K_Vert_Center_Y[p_i] = prec->GetQ(L_K_GRAV + 2);
01595         fHyp_K_Vert_Radius[p_i]   = prec->GetQ(L_K_GRAV + 3);
01596       }
01597       // ---
01598       L_KAON= prec->GetLQ(L_KAON);
01599       if(L_KAON !=0){ 
01600         if(fCurLogFile) *fCurLogFile << "More than one kaon with the same charge in zebra (p_i = " << p_i << ")" << endl;
01601         //      Warning("AnalyzeHype","More than one kaon with the same charge in zebra (p_i = %d)",p_i);
01602         // TerminateFroot();
01603       }
01604     } // single particle (K-/K+) completed
01605   } // K-/K+ loop completed
01606   
01607   // ---
01608   fHypeTree->Fill(); 
01609 }
01610 
01611 // --------------------
01612 //--- check methods ---
01613 // --------------------
01614 
01615 //_____________________________
01616 Int_t TFndPrean::CheckTofinoCFDs(TFndProcessRec *prec){
01617   // find CFD glitches:
01618   // This method MUST be called before processing the standard
01619   // fidarc event reconstruction! (otherwise you will find JFGES empty)
01620   //
01621   //   return values:
01622   //                    0 : event OK (no glitch found)
01623   //               [1-12] : no glitch found on slab [1-12]
01624   //
01625   // --------------------------------------------------------------------
01626   // --- equivalent FORTRAN code in TOFDEC (fidarc-v517: 20/04/2005) ---
01627   // --------------------------------------------------------------------
01628   // C         Check the CFD shift in TOFINO
01629   // C
01630   //       LISLB = LQ(JFGES - 1)
01631   //       DO WHILE (LISLB .NE. 0)
01632   //          IF((IQ(LISLB+4) .NE. 0) .AND. (IQ(LISLB+5) .NE. 0)) THEN
01633   //             TDCDIFF = ABS(Q(LISLB+9)-Q(LISLB+10))
01634   //             TDCSUM  = ABS(Q(LISLB+9)+Q(LISLB+10))
01635   //             IF(TDCDIFF.GT.7.3 .AND. TDCDIFF.LT.25.0 .AND.
01636   //      +         TDCSUM.LT.60.0) THEN
01637   //                IQ(JFGES+6) = 1  ! Set the flag for CFD shift
01638   //             ENDIF
01639   //          ENDIF
01640   //          LISLB = LQ(LISLB)
01641   //       END DO
01642   // C
01643   //       END
01644   // --------------------------------------------------------------------
01645 
01646   Float_t th_dif1 =  7.3;  // TDC difference absolute lower threshold (ns)
01647   Float_t th_dif2 =  25.0; // TDC difference absolute upper threshold (ns)
01648   Float_t th_sum = 60.0;   // TDC sum absolute threshold (ns)
01649   Int_t JFGES = prec->GetJFGES();
01650   if(!JFGES) return 0;
01651   Int_t L_ISLB = prec->GetLQ()[JFGES-1];
01652   while (L_ISLB){
01653     if(!prec->GetIQ()[L_ISLB+4] || !prec->GetIQ()[L_ISLB+5]){
01654       L_ISLB = prec->GetLQ()[L_ISLB];
01655       continue;
01656     }
01657     Float_t tdif = TMath::Abs(prec->GetQ()[L_ISLB+9]-prec->GetQ()[L_ISLB+10]);
01658     Float_t tsum = TMath::Abs(prec->GetQ()[L_ISLB+9]+prec->GetQ()[L_ISLB+10]);
01659     Int_t sl = prec->GetIQ()[L_ISLB+1];
01660     if(fDebugLev>1)
01661       Info("CheckTofinoCFDs", "checking slab %d", sl);
01662     if(tdif>th_dif1 && tdif<th_dif2 && tsum < th_sum){
01663       if(fDebugLev)
01664         if(fCurLogFile) *fCurLogFile << "Tofino glitch detected (slab " << sl << " - ev: " << prec->GetIQ()[JFGES+2] <<  " )" << endl;       
01665       //      Warning("CheckTofinoCFDs", "Tofino glitch detected on slab %d at event %d", sl, prec->GetIQ()[JFGES+2]);
01666       if(fDebugLev>1)
01667         Info("CheckTofinoCFDs", "reconstruction evaluation: CFD bad = %d", prec->GetIQ()[JFGES+6]);
01668       return sl;
01669     }
01670     L_ISLB = prec->GetLQ()[L_ISLB];
01671   }
01672   if(fDebugLev>1)
01673     Info("CheckTofinoCFDs", "NO Tofino glitch detected at event %d ---  reconstruction evaluation: CFD bad = %d",
01674          prec->GetIQ()[JFGES+2], prec->GetIQ()[JFGES+6]);
01675   return 0;
01676 }
01677 

Generated on Tue Oct 16 15:40:47 2007 by  doxygen 1.5.2