--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id$ */
+
+//_________________________________________________________________________
+// Short description
+//
+//*-- Author : Maxim Volkov (RRC KI) & Dmitri Peressounko (RRC KI & SUBATECH)
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+
+// --- Standard library ---
+
+// --- AliRoot header files ---
+
+#include "AliPHOSBeamTestEvent.h"
+
+ClassImp(AliPHOSBeamTestEvent)
+
+
+//____________________________________________________________________________
+ AliPHOSBeamTestEvent::AliPHOSBeamTestEvent():TObject()
+{
+
+}
+
+//____________________________________________________________________________
+ AliPHOSBeamTestEvent::~AliPHOSBeamTestEvent()
+{
+
+}
--- /dev/null
+#ifndef ALIPHOSBEAMTESTEVENT_H
+#define ALIPHOSBEAMTESTEVENT_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $Id$ */
+
+//_________________________________________________________________________
+// Class for PHOS Beam Test event header. Contanes all information
+// about triggers, etc.
+//
+//*-- Author: Maxim Volkov (RRC KI) & Dmitri Peressounko (RRC KI & SUBATECH)
+
+
+// --- ROOT system ---
+#include "TObject.h"
+// --- Standard library ---
+
+// --- AliRoot header files ---
+
+class AliPHOSBeamTestEvent:public TObject {
+
+public:
+ AliPHOSBeamTestEvent() ; // ctor
+
+ virtual ~AliPHOSBeamTestEvent() ; // dtor
+
+ UInt_t * GetUserVector(void){return fUserVector ;}
+ UInt_t * GetHeader(void){return fHeader ;}
+ UShort_t GetPattern(void){return fPattern ;}
+ UShort_t *GetScanning(void){return fScanning ;}
+ UShort_t *GetCharge(void){return fCharge ;}
+ UInt_t * GetScaler(void){return fScaler ;}
+ UShort_t *GetTDC(void) {return fTDC2228 ;}
+
+ void SetUserVector(UInt_t * uv){
+ for(Int_t i=0;i<16;i++)fUserVector[i]=uv[i];}
+ void SetHeader(UInt_t * h){
+ for(Int_t i=0;i<12;i++)fHeader[i]=h[i];}
+ void SetPattern(UShort_t pat){fPattern=pat ;}
+ void SetScanning(UShort_t * scan){
+ for(Int_t i=0;i<32;i++) fScanning[i]=scan[i] ;}
+ void SetCharge(UShort_t *charg){
+ for(Int_t i=0;i<12;i++) fCharge[i]=charg[i] ;}
+ void SetScaler(UInt_t * sc){
+ for(Int_t i=0;i<12;i++) fScaler[i]=sc[i] ;}
+ void SetTDC(UShort_t * tdc) {
+ for(Int_t i=0;i<12;i++) fTDC2228[i]=tdc[i] ;}
+private:
+ UInt_t fUserVector[16] ; //ZEBRA Event user vector
+ UInt_t fHeader[12] ; //ZEBRA event header
+ UInt_t fScaler[12] ; //Scalers, 1 module X 12 (4 byte) ch.
+ UShort_t fPattern ; //Trigger bit register
+ UShort_t fScanning[32] ; //Scanning ADCs,4 modulesX8=32 channels
+ UShort_t fCharge[12] ; //Charge ADCs, 1 module X 12 = 12 ch.
+ UShort_t fTDC2228[32] ; //LeCroy TDC 2228A, 4 module X 8 =32 ch
+
+ ClassDef(AliPHOSBeamTestEvent,1) // description
+
+};
+
+#endif // ALIPHOSBEAMTESTEVENT_H
--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id$ */
+
+//_________________________________________________________________________
+// Short description
+//
+//*-- Author : D.Peressounko (RRC KI & SUBATECH)
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+#include "TFile.h"
+// --- Standard library ---
+#include <iostream.h>
+#include <fstream>
+
+// --- AliRoot header files ---
+#include "AliPHOSConTableDB.h"
+#include "AliPHOSCalibrationDB.h"
+#include "AliPHOSGeometry.h"
+ClassImp(AliPHOSCalibrationDB)
+
+
+//____________________________________________________________________________
+ AliPHOSCalibrationDB::AliPHOSCalibrationDB():TNamed()
+{
+ fPedestals = 0 ;
+ fSlopes = 0;
+ fNChannels = 0 ;
+ fctdb = 0 ;
+}
+//____________________________________________________________________________
+AliPHOSCalibrationDB::AliPHOSCalibrationDB(const char* filename ,const char * database):
+ TNamed("AliPHOSCalibrationDB",database){
+ //Creates the containers: we prepare places for all channels in PHOS
+
+ AliPHOSGeometry * geom = AliPHOSGeometry::GetInstance("GPS2","") ;
+ fNChannels = geom->GetNModules()*geom->GetNPhi()*geom->GetNZ()+
+ geom->GetNumberOfCPVPadsZ()*geom->GetNumberOfCPVPadsPhi()*geom->GetNModules() ;
+ //Note, that to avoid shifting AbsId each time we access data, we do not use
+ //first slot and index runs from 1 to fNChannels inclusively
+ fPedestals = new TArrayF(fNChannels+1) ;
+ fSlopes = new TArrayF(fNChannels+1) ;
+ fctdb = 0 ;
+}
+//____________________________________________________________________________
+ AliPHOSCalibrationDB::~AliPHOSCalibrationDB()
+{
+ if(fPedestals)
+ delete fPedestals ;
+ if(fSlopes)
+ delete fSlopes ;
+}
+//____________________________________________________________________________
+Float_t AliPHOSCalibrationDB::Calibrate(Int_t amp, Int_t absId)const
+{
+ //if absID is known, return calibrated energy, else - zero
+ if(absId <=0 || absId > fNChannels)
+ return 0.0000001 ;
+
+ Float_t ret = (amp - fPedestals->At(absId))*fSlopes->At(absId);
+ if(ret > 0)
+ return ret ;
+ else
+ return 0.0000001 ; //Should not be zero - to avoid FPE
+}
+//____________________________________________________________________________
+void AliPHOSCalibrationDB::SetAll(Float_t pedestal, Float_t slope){
+ //Set all calibration parameters to the same value
+ if(fPedestals)
+ for(Int_t i=0;i<fNChannels;i++){
+ fPedestals->AddAt(pedestal,i) ;
+ fSlopes->AddAt(slope,i);
+ }
+ else
+ cout << "Please, create me with non-default constructor!" << endl;
+}
+//____________________________________________________________________________
+void AliPHOSCalibrationDB::ReadCalibrationParameters(const char * filename, Option_t* opt){
+ //reads calibration parameters from ascii file
+
+ if(strcmp(opt,"gains")==0){ //read gains
+ if(!fctdb){
+ cout << "Specify Connections Table Database first" << endl ;
+ return ;
+ }
+ ifstream gainfile(filename) ;
+ for(Int_t i = 1; i<=64; i++){
+ Float_t slope ;
+ gainfile >> slope ;
+ fSlopes->AddAt(slope,fctdb->Raw2AbsId(i));
+ }
+ gainfile.close();
+ }
+ else
+ if(strstr(opt,"pedest")){ //read pedestals
+ if(!fctdb){
+ cout << "Specify Connections Table Database first" << endl ;
+ return ;
+ }
+ ifstream pfile(filename) ;
+ for(Int_t i = 1; i<=64; i++){
+ Float_t pedestal ;
+ pfile >> pedestal ;
+ fPedestals->AddAt(pedestal,fctdb->Raw2AbsId(i));
+ }
+ pfile.close();
+ }
+ else{
+ cout << "Available options are " << endl ;
+ cout << " `gains' : to read gains " << endl ;
+ cout << " `pedestals : to read pedestals " << endl ;
+ }
+}
+//____________________________________________________________________________
+AliPHOSCalibrationDB& AliPHOSCalibrationDB::operator=(AliPHOSCalibrationDB const & cdb)
+{
+ //
+ fNChannels = cdb.fNChannels;
+ fFileName = cdb.fFileName;
+ fPedestals=cdb.fPedestals ;
+ fSlopes = cdb.fSlopes;
+ return *this ;
+}
--- /dev/null
+#ifndef ALIPHOSCALIBRATIONDB_H
+#define ALIPHOSCALIBRATIONDB_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $Id$ */
+
+//_________________________________________________________________________
+//
+//*-- Author: D.Peressounko (RRC KI & SUBATECH)
+
+
+// --- ROOT system ---
+#include "TNamed.h"
+#include "TArrayF.h"
+#include "TString.h"
+
+// --- Standard library ---
+
+// --- AliRoot header files ---
+class AliPHOSConTableDB ;
+
+class AliPHOSCalibrationDB:public TNamed {
+
+public:
+ AliPHOSCalibrationDB() ; // ctor
+ AliPHOSCalibrationDB(const char* filename ,const char * database = "Primordial") ;
+ virtual ~AliPHOSCalibrationDB() ; // dtor
+
+ //Main method: calibrates if gains are known, otherwise - returns 0
+ Float_t Calibrate(Int_t amp, Int_t absId)const ;
+
+ //Read gains of pedestals from ascii file
+ void ReadCalibrationParameters(const char * filename = "gains.dat",Option_t* opt = "gains") ;
+
+ //Sets the same parameters for all channels
+ void SetAll(Float_t pedestal = 0, Float_t slope = 0.01) ;
+
+ //To know correspondance when reads list of gains from ascii file
+ void SetConTableDB(AliPHOSConTableDB * ctdb){fctdb = ctdb; }
+
+ //Set parameters for particlular channel
+ void SetParameters(Int_t AbsId, Float_t pedestal = 0, Float_t slope = 0.01)
+ {if(fPedestals){fPedestals->AddAt(pedestal,AbsId-1) ; fSlopes->AddAt(slope,AbsId-1) ;} }
+
+ //To be replaced in real DB when updating will really be necessary
+ void Update(Int_t event,Int_t run){}
+
+ AliPHOSCalibrationDB & operator = (const AliPHOSCalibrationDB & ) ;
+private:
+ Int_t fCurentRun ; //!
+ Int_t fNChannels ;
+ TString fFileName ;
+ TArrayF * fPedestals ;
+ TArrayF * fSlopes ;
+ AliPHOSConTableDB * fctdb ; //!
+
+ ClassDef(AliPHOSCalibrationDB,1) // description
+
+};
+
+#endif // AliPHOSCALIBRATIONDB_H
--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id$ */
+
+//_________________________________________________________________________
+// Short description
+//
+//*-- Author : (SUBATECH)
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+#include "TArrayS.h"
+#include "TH2S.h"
+
+// --- Standard library ---
+#include <iostream.h>
+// --- AliRoot header files ---
+#include "AliPHOSGeometry.h"
+#include "AliPHOSConTableDB.h"
+
+ClassImp(AliPHOSConTableDB)
+
+
+//____________________________________________________________________________
+ AliPHOSConTableDB::AliPHOSConTableDB():TNamed("AliPHOSConTableDB","Beamtest2002")
+{
+ fNcrInProto = 0 ;
+ fProtoRaws = 0 ;
+ fProtoColumns = 0 ;
+ fRawOffset = 0 ;
+ fColOffset = 0 ;
+ fGeom = 0;
+ fAbsIdMap = 0 ;
+}
+
+//____________________________________________________________________________
+ AliPHOSConTableDB::AliPHOSConTableDB(const char * title):TNamed("AliPHOSConTableDB",title)
+{
+ fNcrInProto = 0 ;
+ fProtoRaws = 0 ;
+ fProtoColumns = 0 ;
+ fRawOffset = 0 ;
+ fColOffset = 0 ;
+
+ fGeom = AliPHOSGeometry::GetInstance("GPS2","") ;
+
+}
+
+//____________________________________________________________________________
+ AliPHOSConTableDB::~AliPHOSConTableDB()
+{
+ if(fAbsIdMap)
+ delete [] fAbsIdMap ;
+}
+
+//____________________________________________________________________________
+void AliPHOSConTableDB::BuildDB(void)
+{
+ //Make a map between Protopype cristalls and PHOS crystalls
+ //assuming, that prototype is centered in the third module of the PHOS
+ fNcrInProto =fProtoRaws*fProtoColumns ;
+ if(!fNcrInProto){
+ cout << "configuratio of prototype is not known!!!" << endl ;
+ cout << "specify number of raws and columns in prototype" << endl ;
+ return ;
+ }
+ fRawOffset = (fGeom->GetNPhi() - fProtoRaws)/2 ;
+ fColOffset = (fGeom->GetNZ() - fProtoColumns )/ 2 ;
+ fAbsIdMap = new TArrayS(fNcrInProto) ;
+ for(Int_t raw =0; raw < fProtoRaws; raw ++){
+ for(Int_t col = 0; col < fProtoColumns ; col ++){
+ Int_t rawId = col*fProtoRaws + raw ;
+ Int_t rel[4] = {3,0,0,0} ; //We assume, that we deal with third module
+ rel[2]=raw + fRawOffset ;
+ rel[3]=col + fColOffset ;
+ Int_t absId ;
+ fGeom->RelToAbsNumbering(rel,absId) ;
+ fAbsIdMap->AddAt(static_cast<UInt_t>(absId),rawId) ;
+ }
+ }
+
+}
+//____________________________________________________________________________
+void AliPHOSConTableDB::PlotProtoMap(Option_t * opt)
+{
+ //Visualyse connection table
+
+ TH2S * hMapProto = new TH2S("hMap","Map of Prototype ids",
+ fGeom->GetNPhi(),0,fGeom->GetNPhi(),
+ fGeom->GetNZ(),0,fGeom->GetNZ()) ;
+ TH2S * hMapPHOS = new TH2S("hMapPHOS","Map of PHOS ids",
+ fGeom->GetNPhi(),0,fGeom->GetNPhi(),
+ fGeom->GetNZ(),0,fGeom->GetNZ()) ;
+ TH2C * hMapBox = new TH2C("hMapBox","Map of Prototype ids",
+ fGeom->GetNPhi(),0,fGeom->GetNPhi(),
+ fGeom->GetNZ(),0,fGeom->GetNZ()) ;
+ for(Int_t raw =0; raw <fGeom->GetNPhi() ; raw ++)
+ for(Int_t col = 0; col <fGeom->GetNZ() ; col ++)
+ hMapBox->SetBinContent(raw+1,col+1,1) ;
+
+ for(Int_t raw =0; raw < fProtoRaws; raw ++){
+ for(Int_t col = 0; col < fProtoColumns ; col ++){
+ Int_t rawId = col*fProtoRaws + raw ;
+ Int_t rel[4] = {3,0,0,0} ; //We assume, that we deal with third module
+ rel[2]=raw + fRawOffset ;
+ rel[3]=col + fColOffset ;
+ hMapProto->SetBinContent(rel[2]+1,rel[3]+1,rawId);
+ Int_t absId ;
+ fGeom->RelToAbsNumbering(rel,absId) ;
+ hMapPHOS->SetBinContent(rel[2]+1,rel[3]+1,absId) ;
+ }
+ }
+
+
+ if(strstr(opt,"Zoom")||strstr(opt,"zoom")){
+ static_cast<TAxis *>(hMapBox->GetXaxis())->SetRange(fRawOffset+1,fGeom->GetNPhi()-fRawOffset) ;
+ static_cast<TAxis *>(hMapBox->GetYaxis())->SetRange(fColOffset+1,fGeom->GetNZ()-fColOffset) ;
+ }
+ hMapBox->Draw("box") ;
+ if(strstr(opt,"PHOS"))
+ hMapPHOS->Draw("textsame") ;
+ else
+ hMapProto->Draw("textsame") ;
+
+}
+//____________________________________________________________________________
+Int_t AliPHOSConTableDB::Raw2AbsId(Int_t rawId){
+ //converts numbering of modules in prototipe into
+ //numbering in PHOS
+ if(rawId >= 0 && rawId<fNcrInProto)
+ return fAbsIdMap->At(rawId) ;
+ else
+ return 0 ;
+}
+//____________________________________________________________________________
+void AliPHOSConTableDB::Print(Option_t * option)const {
+
+ cout << GetName() << " " << GetTitle() << endl ;
+ cout << "PHOS Geometry configured for " ;
+ if(fGeom)
+ cout << fGeom->GetName() << " " << fGeom->GetTitle() << endl ;
+ else
+ cout << " null " << endl ;
+ cout << "-------Prototype parameters--------" << endl ;
+ cout << " number of columns: " << fProtoColumns << endl ;
+ cout << " number of raws: " << fProtoRaws << endl ;
+ cout << " centered in third PHOS module with offsets: " <<endl ;
+ cout << " raw: " << fRawOffset << " of " << fGeom->GetNPhi() << endl ;
+ cout << " col: " << fColOffset << " of " << fGeom->GetNZ() << endl ;
+ cout << "------------------------------------" << endl ;
+}
--- /dev/null
+#ifndef ALIPHOSCONTABLEDB_H
+#define ALIPHOSCONTABLEDB_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $Id$ */
+
+//_________________________________________________________________________
+// Base Class for PHOS
+//
+//*-- Author: (SUBATECH)
+
+
+// --- ROOT system ---
+#include "TNamed.h"
+class TArrayS ;
+
+// --- Standard library ---
+
+// --- AliRoot header files ---
+class AliPHOSGeometry ;
+
+class AliPHOSConTableDB: public TNamed {
+
+public:
+ AliPHOSConTableDB() ; // ctor
+ AliPHOSConTableDB(const char * title) ; // ctor
+ virtual ~AliPHOSConTableDB() ; // dtor
+
+ //Calculate table from known numbe of raws/columns
+ //assuming that prototype is situated in the center of 3 PHOS mod.
+ void BuildDB(void) ;
+
+ //set the number of columns in prototype
+ void SetNCols(Int_t ncolumns){fProtoColumns = ncolumns ;}
+ //Set the number of raw in prototype
+ void SetNRaws(Int_t nraws){fProtoRaws = nraws ;}
+
+ //Plot correspondance between Prototype Id and PHOS
+ //Options are "Zoom" - only proto region is plotted
+ // "PHOS" - presents both PHOS and Proto ids
+ void PlotProtoMap(Option_t * opt="Zoom") ;
+
+ void Print(Option_t *option="") ;
+
+ //Transforms channel number in prototype into AbsId number in PHOS
+ Int_t Raw2AbsId(Int_t raw) ;
+
+ //Transforms AbsId number in PHOS into channel number in prototype
+ Int_t AbsId2Raw(Int_t AbsId) ;
+
+ virtual void Print(Option_t * option="")const ;
+
+private:
+ AliPHOSGeometry * fGeom ; //!
+
+ Int_t fProtoRaws ; //Parameters
+ Int_t fProtoColumns ; //used to calculate
+ Int_t fRawOffset ; //correspondance
+ Int_t fColOffset ; //map
+ Int_t fNcrInProto ; //Number of channels in prototype
+ TArrayS * fAbsIdMap ; //Map of correspondance between Raw and PHOS ID
+
+ ClassDef(AliPHOSConTableDB,1) // description
+
+
+};
+
+#endif // AliPHOSCONTABLEDB_H
--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id$ */
+
+//_________________________________________________________________________
+// Short description
+//
+/*-- Author: Maxim Volkov (RRC KI)
+ Dmitri Peressounko (RRC KI & SUBATECH)
+ Yuri Kharlov (IHEP & SUBATECH) */
+
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+#include "TClonesArray.h"
+#include "TFile.h"
+#include "TTree.h"
+
+// --- Standard library ---
+#include <iostream.h>
+//#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <netinet/in.h>
+
+// --- AliRoot header files ---
+#include "AliPHOSDigit.h"
+#include "AliPHOSConTableDB.h"
+#include "AliPHOSBeamTestEvent.h"
+#include "AliPHOSRaw2Digits.h"
+#include "AliPHOSv1.h"
+#include "../EVGEN/AliGenBox.h"
+#include "AliRun.h"
+
+ClassImp(AliPHOSRaw2Digits)
+
+
+//____________________________________________________________________________
+ AliPHOSRaw2Digits::AliPHOSRaw2Digits():TTask()
+{
+ fInName="";
+ fMK1 = 0x0123CDEF ;
+ fMK2 = 0x80708070 ;
+ fMK3 = 0x4321ABCD ;
+ fMK4 = 0x80618061 ;
+ fCKW = 0x4640E400 ;
+ fDebug = kFALSE; // Debug flag
+ fIsInitialized = kFALSE ;
+ fTarget[0] = 0 ;
+ fTarget[1] = 0 ;
+ fTarget[2] = 0 ;
+ fDigits = 0 ;
+ fPHOSHeader =0 ;
+ fEvent = 0 ;
+ fctdb = 0;
+}
+//____________________________________________________________________________
+ AliPHOSRaw2Digits::AliPHOSRaw2Digits(const char * filename):TTask("Default","")
+{
+ fInName=filename;
+ TString outname(fInName) ;
+ outname.ToLower() ;
+ outname.ReplaceAll(".fz",".root") ;
+ outname.ReplaceAll(".gz","") ;
+ SetTitle(outname) ;
+
+ fMK1 = 0x0123CDEF ;
+ fMK2 = 0x80708070 ;
+ fMK3 = 0x4321ABCD ;
+ fMK4 = 0x80618061 ;
+ fCKW = 0x4640E400 ;
+ fDebug = kFALSE; // Debug flag
+ fIsInitialized = kFALSE ;
+ fTarget[0] = 0 ;
+ fTarget[1] = 0 ;
+ fTarget[2] = 0 ;
+ fDigits = 0 ;
+ fPHOSHeader =0 ;
+ fEvent = 0 ;
+ fctdb = 0;
+}
+
+//____________________________________________________________________________
+AliPHOSRaw2Digits::~AliPHOSRaw2Digits()
+{
+ if(fPHOSHeader)
+ fPHOSHeader->Delete() ;
+ if(fDigits){
+ fDigits->Delete() ;
+ delete fDigits ;
+ }
+
+}
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::Exec(Option_t * option){
+ //This is steering method performing all the conversion
+
+ if(!fIsInitialized) //need initialization
+ if(!Init()) //failed to initialize
+ return ;
+
+ ProcessRawFile() ;
+
+ FinishRun() ;
+}
+//____________________________________________________________________________
+Bool_t AliPHOSRaw2Digits::Init(void){
+ //Create PHOS geometry, sets magnetic field to zero,
+ //create Generator - to store target position,
+ //opens out file, creates TreeE and make initialization of contaniers
+
+
+ if(fIsInitialized)
+ return kTRUE;
+
+ //Create PHOS
+ new AliPHOSv1("PHOS","GPS2") ;
+
+ //Set Magnetic field
+ gAlice->SetField(0,2);
+
+ //Set positin of the virtex
+ AliGenBox *gener = new AliGenBox(1);
+ Float_t ox = fTarget[1];
+ Float_t oy = fTarget[2]-460.;
+ Float_t oz = fTarget[0];
+ gener->SetOrigin(ox, oy, oz);
+
+ // Create the output file
+ TString outname("") ;
+ if(strstr(GetTitle(),"root")){
+ outname=GetTitle();
+ }
+ else{
+ outname = fInName ;
+ outname.ToLower() ;
+ outname.ReplaceAll(".fz",".root") ;
+ }
+ TFile *rootfile = new TFile(outname,"recreate");
+ rootfile->SetCompressionLevel(2);
+
+ // Create the Root Trees
+ gAlice->MakeTree("E") ;
+
+ //Make container for digits
+ fDigits = new TClonesArray("AliPHOSDigit",1000) ;
+
+ //Fill now TreeE
+ fPHOSHeader = new AliPHOSBeamTestEvent() ;
+ Int_t splitlevel = 0 ;
+ Int_t bufferSize = 32000 ;
+ TBranch * headerBranch = gAlice->TreeE()->Branch("AliPHOSBeamTestEvent",
+ "AliPHOSBeamTestEvent",
+ &fPHOSHeader,bufferSize,splitlevel);
+ headerBranch->SetName("AliPHOSBeamTestEvent") ;
+
+ fIsInitialized = kTRUE ;
+ return kTRUE ;
+}
+//____________________________________________________________________________
+Bool_t AliPHOSRaw2Digits::ProcessRawFile(){
+
+ //Method opens zebra file and reads successively bytes from it,
+ //filling corresponding fields in header and digits.
+
+
+ fStatus= -3 ;
+ //First of all, open file and check if it is a zebra file
+
+ char command[256];
+ sprintf(command,"zcat %s",fInName.Data());
+ FILE *dataFile = popen(command, "r");
+ if (dataFile == NULL) {
+ cout << " Can not open file " << fInName.Data() << endl ;
+ perror(fInName.Data()) ;
+ fStatus = -1 ;
+ return kFALSE ;
+ }
+ printf("Open pipe: %s\n",command);
+
+ // Check if byte ordering is little-endian
+ UInt_t w = 0x12345678;
+ Int_t swapo = memcmp(&w, "\x78\x56\x34\x12", sizeof(UInt_t)) == 0;
+ if(fDebug)
+ cout << "swapo=" << swapo << endl;
+
+
+ UInt_t recBuf[300] ;
+
+ // Read physical record control words
+ UInt_t nb = 8*sizeof(UInt_t);
+ Int_t n = fread(recBuf, nb, 1, dataFile);
+ if(static_cast<UInt_t>(n) != 1) {
+ if (n < 0 )
+ perror(fInName.Data());
+ else
+ cout << "Could not read physical record control words" << endl;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+
+ if(fDebug)
+ cout << "recbuf[0] = " << recBuf[0] << endl ;
+
+ // Check if it is a ZEBRA file and if the words are swapped
+ UInt_t swapi = 0 ;
+ if (recBuf[0] != fMK1) {
+ Swab4(recBuf, &w, 1);
+ if (w != fMK1) {
+ cout << "Does not look like a ZEBRA file\n";
+ pclose(dataFile) ;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+ swapi=1 ;
+ }
+
+ if(fDebug){
+ cout << " w = " << w << endl ;;
+ cout << " swapi = " << swapi << endl ;;
+ }
+
+ // Get number of words in physical record
+ UInt_t nwphr ;
+ if (swapi)
+ Swab4(&recBuf[4],&nwphr,1);
+ else
+ nwphr = recBuf[4];
+ nwphr*=2; // 1998 -- Now we have 2 records 150 words each
+
+
+ //start loop over data
+ // Read rest of record
+ nb = (nwphr-8)*sizeof(UInt_t);
+ n = fread(&recBuf[8], nb, 1, dataFile) ;
+ if (static_cast<UInt_t>(n) != 1) {
+ if (n < 0 ){
+ perror(fInName.Data());
+ fStatus = -2 ;
+ return kFALSE;
+ }
+ }
+ nb = nwphr *sizeof(UInt_t);
+
+ UInt_t userVector[16] ;
+ UInt_t zheader[12];
+ UShort_t pattern ;
+ UShort_t scanning[32] ;
+ UShort_t charge[12];
+ UInt_t scaler[12];
+ UShort_t tdc2228[32];
+
+ //read untill the end of file
+ fEvent=0 ;
+ while(1){
+
+ // StartNewEvent() ;
+ fDigits->Delete() ;
+ gAlice->SetEvent(fEvent) ;
+
+ Int_t i ;
+ for(i=0;i<16;i++)
+ userVector[i]=*(recBuf+21+i);
+ if(!swapi)
+ Swab4(userVector, userVector, 16);
+ fPHOSHeader->SetUserVector(userVector) ;
+
+
+ // ZEBRA event header
+ for(i=0;i<12;i++)
+ zheader[i]=*(recBuf+47+i);
+ if(swapi)
+ Swab4(zheader, zheader, 12);
+ fPHOSHeader->SetHeader(zheader) ;
+
+ // Swap input
+ if (swapi)
+ Swab4(recBuf, recBuf, nwphr);
+
+ /* Physical record control words */
+ UInt_t * recptr = recBuf; //Pointer to current position
+
+ if(recptr[7] != 1) {
+ cout << "Can not handle fast blocks" << endl;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+ recptr += 8;
+
+ // Logical record control words
+ UInt_t lrtyp = recptr[1];
+ if (lrtyp != 3) {
+ cout << "Can not handle logical record type " << lrtyp << endl ;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+
+ recptr += 2;
+ if (recptr[0] != fCKW) {
+ cout << "Bad check word" << endl;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+
+ UInt_t nwuh = recptr[9];
+ recptr += 10+nwuh;
+
+ // Bank system words
+ UInt_t nd = recptr[8]; /* Number of data words */
+ recptr += 10;
+
+ // Data words
+ UInt_t evtno = recptr[2]; /* Event number */
+
+ if(fDebug)
+ cout << "evtno=" << evtno << endl;
+
+ UInt_t nh = recptr[4]; /* Number of header words in data bank */
+ recptr += nh;
+
+ // Unswap data from VME
+ if (swapi)
+ Swab4(recptr, recptr, nd-nh-3);
+
+ // Give buffer to monitor program
+ // UInt_t esize = nd-nh-3;
+ // if (swapo)
+ // Swab2(recptr, recptr, esize);
+ // Two byte data are correct after this operation.
+ //But we're in trouble if the data array contains 4 byte data!
+
+ // From now on deal with VME data (MSB first, or network byte order).
+
+
+ // Fill the event with data from ADCs
+ UChar_t *byteptr=(UChar_t*)recptr;
+
+ // Trigger bit register
+ pattern=ntohs(*(UShort_t*)byteptr);
+ fPHOSHeader->SetPattern(pattern) ;
+ byteptr+=sizeof(UShort_t);
+
+ // Either peak ADCs, 10 modulesX8=80 channels,
+ //or Kurchatov 64+2 channel ADC
+ //(the rest of the channels padded with 0xffff)
+ for(i=0;i<80;i++){
+ Int_t peak = static_cast<Int_t>(ntohs(*(UShort_t*)byteptr));
+ //make digit
+ Int_t absID = fctdb->Raw2AbsId(i) ;
+ if(absID > 0)
+ new((*fDigits)[i])AliPHOSDigit(-1,absID,peak,0.,i) ;
+ if(fDebug){
+ if(peak>(UShort_t)1000)
+ cout << "event=" << fEvent << " peak[" << i << "] = "<<peak << endl;
+ }
+ byteptr+=sizeof(UShort_t);
+ }
+
+ // Scanning ADCs, 4 modulesX8=32 channels
+ for(i=0;i<32;i++){
+ scanning[i]=ntohs(*(UShort_t*)byteptr);
+ byteptr+=sizeof(UShort_t);
+ }
+ fPHOSHeader->SetScanning(scanning) ;
+
+ // Charge ADCs, 1 moduleX12=12 channels
+ for(i=0;i<12;i++){
+ charge[i]=ntohs(*(UShort_t*)byteptr);
+ byteptr+=sizeof(UShort_t);
+ }
+ fPHOSHeader->SetCharge(charge) ;
+
+ // Scalers, 1 moduleX12=12 (4 byte) channels
+ for(i=0;i<12;i++){
+ scaler[i]=ntohl(*(UInt_t*)byteptr);
+ byteptr+=sizeof(UInt_t);
+ }
+ fPHOSHeader->SetScaler(scaler) ;
+
+ // LeCroy TDC 2228A, 4 moduleX8=32 channels
+ for(i=0;i<8;i++){
+ tdc2228[i]=ntohs(*(UShort_t*)byteptr);
+ byteptr+=sizeof(UShort_t);
+ }
+ fPHOSHeader->SetTDC(tdc2228) ;
+
+ WriteDigits() ;
+ if(fDebug)
+ cout << "event=" << fEvent << " written " << endl;
+
+ // Read next record
+ UInt_t nb = nwphr *sizeof(UInt_t);
+ n = fread( recBuf, nb,1,dataFile);
+ if (n < 0 ){
+ perror(fInName);
+ fStatus = -2 ;
+ return kFALSE;
+ }
+ if (static_cast<UInt_t>(n) != 1) {
+ pclose(dataFile) ;
+ fStatus = 1 ;
+ return kTRUE ; //all read
+ }
+ fEvent++ ;
+ }
+
+ fStatus = 1 ;
+ return kTRUE ;
+}
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::Swab4(void *from, void *to, size_t nwords){
+ // The function swaps 4 bytes: byte#3<-->byte#0, byte#2<-->byte#1
+ register char *pf=static_cast<char*>(from) ;
+ register char *pt=static_cast<char*>(to) ;
+ register char c;
+ while (nwords-- > 0 ) {
+ c = pf[0];
+ pt[0] = pf[3];
+ pt[3] = c;
+ c = pf[1];
+ pt[1] = pf[2];
+ pt[2] = c;
+ pf += 4;
+ pt += 4;
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::Swab2(void *from, void *to, size_t nwords)
+{ //The function swaps 2x2 bytes: byte#0<-->byte#1, byte#2<-->byte#3
+ register char *pf=static_cast<char*>(from) ;
+ register char *pt=static_cast<char*>(to);
+ register char c;
+ while (nwords-- > 0 ) {
+ c = pf[0];
+ pt[0] = pf[1];
+ pt[1] = c;
+ c = pf[2];
+ pt[2] = pf[3];
+ pt[3] = c;
+ pf += 4;
+ pt += 4;
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::FinishRun(){
+ //Write geometry and header tree
+ gAlice->Write(0,TObject::kOverwrite);
+ gAlice->TreeE()->Write(0,TObject::kOverwrite);
+
+}
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::WriteDigits(void){
+ //In this method we create TreeD, write digits and Raw2Digits to it
+ // and write Header to TreeE. Finally we write TreeD to root file
+
+ //Start from Digits
+ fDigits->Sort() ;
+ fDigits->Expand(fDigits->GetEntriesFast()) ;
+ for(Int_t i=0;i<fDigits->GetEntriesFast(); i++)
+ static_cast<AliPHOSDigit*>(fDigits->At(i))->SetIndexInList(i) ;
+
+ char hname[30];
+ sprintf(hname,"TreeD%d",fEvent);
+ TTree * treeD = new TTree(hname,"Digits");
+ //treeD->Write(0,TObject::kOverwrite);
+
+ // -- create Digits branch
+ Int_t bufferSize = 32000 ;
+ TBranch * digitsBranch = treeD->Branch("PHOS",&fDigits,bufferSize);
+ digitsBranch->SetTitle("Default");
+
+ // -- Create Digitizer branch
+ Int_t splitlevel = 0 ;
+ const AliPHOSRaw2Digits * d = this ;
+ TBranch * digitizerBranch = treeD->Branch("AliPHOSRaw2Digits",
+ "AliPHOSRaw2Digits", &d,bufferSize,splitlevel);
+ digitizerBranch->SetTitle("Default");
+
+ digitsBranch->Fill() ;
+ digitizerBranch->Fill() ;
+ treeD->Write(0,TObject::kOverwrite);
+
+ delete treeD ;
+
+ //Write header
+ gAlice->TreeE()->Fill();
+}
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::Print(Option_t * option)const{
+
+ cout << "----------AliPHOSRaw2Digits----------" << endl ;
+ cout << "Input stream " << endl ;
+ cout << "Current input File: " << fInName.Data() << endl ;
+ cout << "Current output File: " << GetTitle() << endl ;
+ cout << "Events processes in the last file " << fEvent << endl ;
+ cout << "Input file status " ;
+ switch (fStatus){
+ case 0: cout << "`Have not processed yet' " << endl ;
+ break ;
+ case 1: cout << "`Processed normally' " << endl ;
+ break ;
+ case -1: cout << "`File not found'" << endl ;
+ break ;
+ case -2: cout << "`Error in reading' " << endl ;
+ break ;
+ case -3: cout << "'Interupted'" << endl ;
+ default: ;
+ }
+ cout << "Connection table: " ;
+ if(fctdb)
+ cout << fctdb->GetName() << " " << fctdb->GetTitle() << endl ;
+ else
+ cout << " no DB " << endl ;
+
+}
--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id$ */
+
+//_________________________________________________________________________
+// Short description
+//
+/*-- Author: Maxim Volkov (RRC KI)
+ Dmitri Peressounko (RRC KI & SUBATECH)
+ Yuri Kharlov (IHEP & SUBATECH) */
+
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+#include "TClonesArray.h"
+#include "TFile.h"
+#include "TTree.h"
+
+// --- Standard library ---
+#include <iostream.h>
+//#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <netinet/in.h>
+
+// --- AliRoot header files ---
+#include "AliPHOSDigit.h"
+#include "AliPHOSConTableDB.h"
+#include "AliPHOSBeamTestEvent.h"
+#include "AliPHOSRaw2Digits.h"
+#include "AliPHOSv1.h"
+#include "../EVGEN/AliGenBox.h"
+#include "AliRun.h"
+
+ClassImp(AliPHOSRaw2Digits)
+
+
+//____________________________________________________________________________
+ AliPHOSRaw2Digits::AliPHOSRaw2Digits():TTask()
+{
+ fInName="";
+ fMK1 = 0x0123CDEF ;
+ fMK2 = 0x80708070 ;
+ fMK3 = 0x4321ABCD ;
+ fMK4 = 0x80618061 ;
+ fCKW = 0x4640E400 ;
+ fDebug = kFALSE; // Debug flag
+ fIsInitialized = kFALSE ;
+ fTarget[0] = 0 ;
+ fTarget[1] = 0 ;
+ fTarget[2] = 0 ;
+ fDigits = 0 ;
+ fPHOSHeader =0 ;
+ fEvent = 0 ;
+ fctdb = 0;
+}
+//____________________________________________________________________________
+ AliPHOSRaw2Digits::AliPHOSRaw2Digits(const char * filename):TTask("Default","")
+{
+ fInName=filename;
+ TString outname(fInName) ;
+ outname.ToLower() ;
+ outname.ReplaceAll(".fz",".root") ;
+ SetTitle(outname) ;
+
+ fMK1 = 0x0123CDEF ;
+ fMK2 = 0x80708070 ;
+ fMK3 = 0x4321ABCD ;
+ fMK4 = 0x80618061 ;
+ fCKW = 0x4640E400 ;
+ fDebug = kFALSE; // Debug flag
+ fIsInitialized = kFALSE ;
+ fTarget[0] = 0 ;
+ fTarget[1] = 0 ;
+ fTarget[2] = 0 ;
+ fDigits = 0 ;
+ fPHOSHeader =0 ;
+ fEvent = 0 ;
+ fctdb = 0;
+}
+
+//____________________________________________________________________________
+AliPHOSRaw2Digits::~AliPHOSRaw2Digits()
+{
+ if(fPHOSHeader)
+ fPHOSHeader->Delete() ;
+ if(fDigits){
+ fDigits->Delete() ;
+ delete fDigits ;
+ }
+
+}
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::Exec(Option_t * option){
+ //This is steering method performing all the conversion
+
+ if(!fIsInitialized) //need initialization
+ if(!Init()) //failed to initialize
+ return ;
+
+ ProcessRawFile() ;
+
+ FinishRun() ;
+}
+//____________________________________________________________________________
+Bool_t AliPHOSRaw2Digits::Init(void){
+ //Create PHOS geometry, sets magnetic field to zero,
+ //create Generator - to store target position,
+ //opens out file, creates TreeE and make initialization of contaniers
+
+
+ if(fIsInitialized)
+ return kTRUE;
+
+ //Create PHOS
+ new AliPHOSv1("PHOS","GPS2") ;
+
+ //Set Magnetic field
+ gAlice->SetField(0,2);
+
+ //Set positin of the virtex
+ AliGenBox *gener = new AliGenBox(1);
+ Float_t ox = fTarget[1];
+ Float_t oy = fTarget[2]-460.;
+ Float_t oz = fTarget[0];
+ gener->SetOrigin(ox, oy, oz);
+
+ // Create the output file
+ TString outname("") ;
+ if(strstr(GetTitle(),"root")){
+ outname=GetTitle();
+ }
+ else{
+ outname = fInName ;
+ outname.ToLower() ;
+ outname.ReplaceAll(".fz",".root") ;
+ }
+ TFile *rootfile = new TFile(outname,"recreate");
+ rootfile->SetCompressionLevel(2);
+
+ // Create the Root Trees
+ gAlice->MakeTree("E") ;
+
+ //Make container for digits
+ fDigits = new TClonesArray("AliPHOSDigit",1000) ;
+
+ //Fill now TreeE
+ fPHOSHeader = new AliPHOSBeamTestEvent() ;
+ Int_t splitlevel = 0 ;
+ Int_t bufferSize = 32000 ;
+ TBranch * headerBranch = gAlice->TreeE()->Branch("AliPHOSBeamTestEvent",
+ "AliPHOSBeamTestEvent",
+ &fPHOSHeader,bufferSize,splitlevel);
+ headerBranch->SetName("AliPHOSBeamTestEvent") ;
+
+ fIsInitialized = kTRUE ;
+ return kTRUE ;
+}
+//____________________________________________________________________________
+Bool_t AliPHOSRaw2Digits::ProcessRawFile(){
+
+ //Method opens zebra file and reads successively bytes from it,
+ //filling corresponding fields in header and digits.
+
+
+ fStatus= -3 ;
+ //First of all, open file and check if it is a zebra file
+
+ char command[256];
+ sprintf(command,"zcat %s",fInName.Data());
+ FILE *dataFile = popen(command, "r");
+ if (dataFile == NULL) {
+ cout << " Can not open file " << fInName.Data() << endl ;
+ perror(fInName.Data()) ;
+ fStatus = -1 ;
+ return kFALSE ;
+ }
+ printf("Open pipe: %s\n",command);
+
+// Int_t dataFile = open(fInName.Data(), O_RDONLY);
+// if(dataFile == -1){
+// cout << " Can not open file " << fInName.Data() << endl ;
+// perror(fInName.Data()) ;
+// fStatus = -1 ;
+// return kFALSE ;
+// }
+
+ // Check if byte ordering is little-endian
+ UInt_t w = 0x12345678;
+ Int_t swapo = memcmp(&w, "\x78\x56\x34\x12", sizeof(UInt_t)) == 0;
+ if(fDebug)
+ cout << "swapo=" << swapo << endl;
+
+
+ UInt_t recBuf[300] ;
+
+ // Read physical record control words
+ UInt_t nb = 8*sizeof(UInt_t);
+ Int_t n = fread(recBuf, nb, 1, dataFile);
+// Int_t n = read(dataFile, recBuf, nb);
+ if(static_cast<UInt_t>(n) != 1) {
+// if(static_cast<UInt_t>(n) != nb) {
+ if (n < 0 )
+ perror(fInName.Data());
+ else
+ cout << "Could not read physical record control words" << endl;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+
+
+ if(fDebug)
+ cout << "recbuf[0] = " << recBuf[0] << endl ;
+
+ // Check if it is a ZEBRA file and if the words are swapped
+ UInt_t swapi = 0 ;
+ if (recBuf[0] != fMK1) {
+ Swab4(recBuf, &w, 1);
+ if (w != fMK1) {
+ cout << "Does not look like a ZEBRA file\n";
+ pclose(dataFile) ;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+ swapi=1 ;
+ }
+
+ if(fDebug){
+ cout << " w = " << w << endl ;;
+ cout << " swapi = " << swapi << endl ;;
+ }
+
+ // Get number of words in physical record
+ UInt_t nwphr ;
+ if (swapi)
+ Swab4(&recBuf[4],&nwphr,1);
+ else
+ nwphr = recBuf[4];
+ nwphr*=2; // 1998 -- Now we have 2 records 150 words each
+
+
+ //start loop over data
+ // Read rest of record
+ nb = (nwphr-8)*sizeof(UInt_t);
+ n = fread(&recBuf[8], nb, 1, dataFile) ;
+// n = read(dataFile, &recBuf[8], nb) ;
+ if (static_cast<UInt_t>(n) != 1) {
+ if (n < 0 ){
+ perror(fInName.Data());
+ fStatus = -2 ;
+ return kFALSE;
+ }
+ }
+ nb = nwphr *sizeof(UInt_t);
+
+ UInt_t userVector[16] ;
+ UInt_t zheader[12];
+ UShort_t pattern ;
+ UShort_t scanning[32] ;
+ UShort_t charge[12];
+ UInt_t scaler[12];
+ UShort_t tdc2228[32];
+
+ //read untill the end of file
+ fEvent=0 ;
+ while(1){
+
+ // StartNewEvent() ;
+ fDigits->Delete() ;
+ gAlice->SetEvent(fEvent) ;
+
+ Int_t i ;
+ for(i=0;i<16;i++)
+ userVector[i]=*(recBuf+21+i);
+ if(!swapi)
+ Swab4(userVector, userVector, 16);
+ fPHOSHeader->SetUserVector(userVector) ;
+
+
+ // ZEBRA event header
+ for(i=0;i<12;i++)
+ zheader[i]=*(recBuf+47+i);
+ if(swapi)
+ Swab4(zheader, zheader, 12);
+ fPHOSHeader->SetHeader(zheader) ;
+
+ // Swap input
+ if (swapi)
+ Swab4(recBuf, recBuf, nwphr);
+
+ /* Physical record control words */
+ UInt_t * recptr = recBuf; //Pointer to current position
+
+ if(recptr[7] != 1) {
+ cout << "Can not handle fast blocks" << endl;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+ recptr += 8;
+
+ // Logical record control words
+ UInt_t lrtyp = recptr[1];
+ if (lrtyp != 3) {
+ cout << "Can not handle logical record type " << lrtyp << endl ;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+
+ recptr += 2;
+ if (recptr[0] != fCKW) {
+ cout << "Bad check word" << endl;
+ fStatus = -2 ;
+ return kFALSE;
+ }
+
+ UInt_t nwuh = recptr[9];
+ recptr += 10+nwuh;
+
+ // Bank system words
+ UInt_t nd = recptr[8]; /* Number of data words */
+ recptr += 10;
+
+ // Data words
+ UInt_t evtno = recptr[2]; /* Event number */
+
+ if(fDebug)
+ cout << "evtno=" << evtno << endl;
+
+ UInt_t nh = recptr[4]; /* Number of header words in data bank */
+ recptr += nh;
+
+ // Unswap data from VME
+ if (swapi)
+ Swab4(recptr, recptr, nd-nh-3);
+
+ // Give buffer to monitor program
+ // UInt_t esize = nd-nh-3;
+ // if (swapo)
+ // Swab2(recptr, recptr, esize);
+ // Two byte data are correct after this operation.
+ //But we're in trouble if the data array contains 4 byte data!
+
+ // From now on deal with VME data (MSB first, or network byte order).
+
+
+ // Fill the event with data from ADCs
+ UChar_t *byteptr=(UChar_t*)recptr;
+
+ // Trigger bit register
+ pattern=ntohs(*(UShort_t*)byteptr);
+ fPHOSHeader->SetPattern(pattern) ;
+ byteptr+=sizeof(UShort_t);
+
+ // Either peak ADCs, 10 modulesX8=80 channels,
+ //or Kurchatov 64+2 channel ADC
+ //(the rest of the channels padded with 0xffff)
+ for(i=0;i<80;i++){
+ Int_t peak = static_cast<Int_t>(ntohs(*(UShort_t*)byteptr));
+ //make digit
+ Int_t absID = fctdb->Raw2AbsId(i) ;
+ if(absID > 0)
+ new((*fDigits)[i])AliPHOSDigit(-1,absID,peak,0.,i) ;
+ if(fDebug){
+ if(peak>(UShort_t)1000)
+ cout << "event=" << fEvent << " peak[" << i << "] = "<<peak << endl;
+ }
+ byteptr+=sizeof(UShort_t);
+ }
+
+ // Scanning ADCs, 4 modulesX8=32 channels
+ for(i=0;i<32;i++){
+ scanning[i]=ntohs(*(UShort_t*)byteptr);
+ byteptr+=sizeof(UShort_t);
+ }
+ fPHOSHeader->SetScanning(scanning) ;
+
+ // Charge ADCs, 1 moduleX12=12 channels
+ for(i=0;i<12;i++){
+ charge[i]=ntohs(*(UShort_t*)byteptr);
+ byteptr+=sizeof(UShort_t);
+ }
+ fPHOSHeader->SetCharge(charge) ;
+
+ // Scalers, 1 moduleX12=12 (4 byte) channels
+ for(i=0;i<12;i++){
+ scaler[i]=ntohl(*(UInt_t*)byteptr);
+ byteptr+=sizeof(UInt_t);
+ }
+ fPHOSHeader->SetScaler(scaler) ;
+
+ // LeCroy TDC 2228A, 4 moduleX8=32 channels
+ for(i=0;i<8;i++){
+ tdc2228[i]=ntohs(*(UShort_t*)byteptr);
+ byteptr+=sizeof(UShort_t);
+ }
+ fPHOSHeader->SetTDC(tdc2228) ;
+
+ WriteDigits() ;
+ if(fDebug)
+ cout << "event=" << fEvent << " written " << endl;
+
+ // Read next record
+ UInt_t nb = nwphr *sizeof(UInt_t);
+ n = fread( recBuf, nb,1,dataFile);
+// n = read(dataFile, recBuf, nb) ;
+ if (n < 0 ){
+ perror(fInName);
+ fStatus = -2 ;
+ return kFALSE;
+ }
+ if (static_cast<UInt_t>(n) != 1) {
+ pclose(dataFile) ;
+ fStatus = 1 ;
+ return kTRUE ; //all read
+ }
+ fEvent++ ;
+ }
+
+ fStatus = 1 ;
+ return kTRUE ;
+}
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::Swab4(void *from, void *to, size_t nwords){
+ // The function swaps 4 bytes: byte#3<-->byte#0, byte#2<-->byte#1
+ register char *pf=static_cast<char*>(from) ;
+ register char *pt=static_cast<char*>(to) ;
+ register char c;
+ while (nwords-- > 0 ) {
+ c = pf[0];
+ pt[0] = pf[3];
+ pt[3] = c;
+ c = pf[1];
+ pt[1] = pf[2];
+ pt[2] = c;
+ pf += 4;
+ pt += 4;
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::Swab2(void *from, void *to, size_t nwords)
+{ //The function swaps 2x2 bytes: byte#0<-->byte#1, byte#2<-->byte#3
+ register char *pf=static_cast<char*>(from) ;
+ register char *pt=static_cast<char*>(to);
+ register char c;
+ while (nwords-- > 0 ) {
+ c = pf[0];
+ pt[0] = pf[1];
+ pt[1] = c;
+ c = pf[2];
+ pt[2] = pf[3];
+ pt[3] = c;
+ pf += 4;
+ pt += 4;
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::FinishRun(){
+ //Write geometry and header tree
+ gAlice->Write(0,TObject::kOverwrite);
+ gAlice->TreeE()->Write(0,TObject::kOverwrite);
+
+}
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::WriteDigits(void){
+ //In this method we create TreeD, write digits and Raw2Digits to it
+ // and write Header to TreeE. Finally we write TreeD to root file
+
+ //Start from Digits
+ fDigits->Sort() ;
+ fDigits->Expand(fDigits->GetEntriesFast()) ;
+ for(Int_t i=0;i<fDigits->GetEntriesFast(); i++)
+ static_cast<AliPHOSDigit*>(fDigits->At(i))->SetIndexInList(i) ;
+
+ char hname[30];
+ sprintf(hname,"TreeD%d",fEvent);
+ TTree * treeD = new TTree(hname,"Digits");
+ //treeD->Write(0,TObject::kOverwrite);
+
+ // -- create Digits branch
+ Int_t bufferSize = 32000 ;
+ TBranch * digitsBranch = treeD->Branch("PHOS",&fDigits,bufferSize);
+ digitsBranch->SetTitle("Default");
+
+ // -- Create Digitizer branch
+ Int_t splitlevel = 0 ;
+ const AliPHOSRaw2Digits * d = this ;
+ TBranch * digitizerBranch = treeD->Branch("AliPHOSRaw2Digits",
+ "AliPHOSRaw2Digits", &d,bufferSize,splitlevel);
+ digitizerBranch->SetTitle("Default");
+
+ digitsBranch->Fill() ;
+ digitizerBranch->Fill() ;
+ treeD->Write(0,TObject::kOverwrite);
+
+ delete treeD ;
+
+ //Write header
+ gAlice->TreeE()->Fill();
+}
+//____________________________________________________________________________
+void AliPHOSRaw2Digits::Print(Option_t * option)const{
+
+ cout << "----------AliPHOSRaw2Digits----------" << endl ;
+ cout << "Input stream " << endl ;
+ cout << "Current input File: " << fInName.Data() << endl ;
+ cout << "Current output File: " << GetTitle() << endl ;
+ cout << "Events processes in the last file " << fEvent << endl ;
+ cout << "Input file status " ;
+ switch (fStatus){
+ case 0: cout << "`Have not processed yet' " << endl ;
+ break ;
+ case 1: cout << "`Processed normally' " << endl ;
+ break ;
+ case -1: cout << "`File not found'" << endl ;
+ break ;
+ case -2: cout << "`Error in reading' " << endl ;
+ break ;
+ case -3: cout << "'Interupted'" << endl ;
+ default: ;
+ }
+ cout << "Connection table: " ;
+ if(fctdb)
+ cout << fctdb->GetName() << " " << fctdb->GetTitle() << endl ;
+ else
+ cout << " no DB " << endl ;
+
+}
--- /dev/null
+#ifndef ALIPHOSRAW2DIGITS_H
+#define ALIPHOSRAW2DIGITS_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $id */
+
+//_________________________________________________________________________
+// Base Class for PHOS
+//
+/*-- Author: Maxim Volkov (RRC KI)
+ Dmitri Peressounko (RRC KI & SUBATECH)
+ Yuri Kharlov (IHEP & SUBATECH) */
+
+// --- ROOT system ---
+#include "TTask.h"
+class TClonesArray ;
+
+// --- Standard library ---
+
+// --- AliRoot header files ---
+class AliPHOSGeometry ;
+class AliPHOSBeamTestEvent ;
+class AliPHOSConTableDB ;
+
+class AliPHOSRaw2Digits : public TTask {
+
+public:
+ AliPHOSRaw2Digits() ; // ctor
+ AliPHOSRaw2Digits(const char * inputFileName) ;
+ virtual ~AliPHOSRaw2Digits() ; // dtor
+
+ void Exec(Option_t *option) ;
+
+ void SetInputFile(TString inname="Run_1234.fz"){fInName=inname ; }
+ void SetDebugLevel(Int_t idebug=1){fDebug=idebug ;}
+
+ //Set position of the target in the given run.
+ //The reference system is following
+ //Z axis along beam direction, from target to prototype (0-surface of prototype)
+ //X axis along columns of prototype (0-center of prototype)
+ //Y axis along raws of prototype (0-center of prototype)
+ void SetTargetPosition(Double_t * pos)
+ {for(Int_t i=0;i<3;i++)fTarget[i]=pos[i] ;}
+ void SetConTableDB(AliPHOSConTableDB * ctdb){fctdb = ctdb ;}
+ void Print(Option_t *option="")const ;
+
+private:
+ void FinishRun() ;
+ Bool_t ProcessRawFile() ;
+ void Swab4(void *from, void *to, size_t nwords) ;
+ void Swab2(void *from, void *to, size_t nwords) ;
+ Bool_t Init() ;
+ void WriteDigits(void) ;
+
+ TClonesArray * fDigits ; //!list of final digits
+ AliPHOSBeamTestEvent * fPHOSHeader ; //!
+ AliPHOSConTableDB * fctdb ; //!
+ Double_t fTarget[3] ; //!Position of the target
+ Int_t fEvent ; //
+ Int_t fStatus ; //status of input file: OK, not found etc.
+ TString fInName ; // FileName of the input file
+ Bool_t fDebug ; //!
+ Bool_t fIsInitialized ; //!
+ UInt_t fMK1 ; //!ZEBRA markers
+ UInt_t fMK2 ; //!
+ UInt_t fMK3 ; //!
+ UInt_t fMK4 ; //!
+ UInt_t fCKW ; //!
+
+ ClassDef(AliPHOSRaw2Digits,1) // description
+
+};
+
+#endif // AliPHOSRAW2DIGITS_H
--- /dev/null
+#ifndef ALIPHOSRAW2DIGITS_H
+#define ALIPHOSRAW2DIGITS_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $id */
+
+//_________________________________________________________________________
+// Base Class for PHOS
+//
+/*-- Author: Maxim Volkov (RRC KI)
+ Dmitri Peressounko (RRC KI & SUBATECH)
+ Yuri Kharlov (IHEP & SUBATECH) */
+
+// --- ROOT system ---
+#include "TTask.h"
+class TClonesArray ;
+
+// --- Standard library ---
+
+// --- AliRoot header files ---
+class AliPHOSGeometry ;
+
+class AliPHOSRaw2Digits : public TTask {
+
+public:
+ AliPHOSRaw2Digits() ; // ctor
+ virtual ~AliPHOSRaw2Digits() ; // dtor
+
+ void Exec(Option_t *option) ;
+ Bool_t OpenOutFile() ;
+
+ void SetInputFile(TString inname="Run2002.rz"){fInName=inname ; }
+ void SetDebugLevel(Int_t idebug=1){fDebug=idebug ;}
+ void SetNRaws(Int_t nraws){fProtoRaws = nraws ;}
+ void SetNcols(Int_t ncolumns){fProtoColumns = ncolumns ;}
+ void Print(Option_t *option) ;
+
+private:
+ Bool_t ProcessRawFile() ;
+ void Swab4(void *from, void *to, size_t nwords) ;
+ void Swab2(void *from, void *to, size_t nwords) ;
+ Int_t RawId2AbsId(Int_t raw) ;
+ Bool_t Init() ;
+
+
+ TClonesArray * fBTHeaders ; //!list of beam test headers
+ AliPHOSGeometry * fGeom ; //!
+ Int_t fEvent ; //!
+ Int_t fStatus ; //! status of input file: OK, not found etc.
+ TString fInName ; //!FileName of the input file
+ Bool_t fDebug ; //!
+ Bool_t fIsInitialized ;
+ Int_t fProtoRaws ;
+ Int_t fProtoColumns ;
+ Int_t fRawOffset ;
+ Int_t fColOffset ;
+ Int_t fNcrInProto ; //!Number of cristalls in prototype
+ UInt_t *fAbsIdMap ;//[fNcrInProto] Map of correspondance between Raw and PHOS ID
+ UInt_t fMK1 ; //!ZEBRA markers
+ UInt_t fMK2 ; //!
+ UInt_t fMK3 ; //!
+ UInt_t fMK4 ; //!
+ UInt_t fCKW ; //!
+
+ ClassDef(AliPHOSRaw2Digits,1) // description
+
+};
+
+#endif // AliPHOSRAW2DIGITS_H
#pragma link C++ class AliPHOSEvalRecPoint+;
#pragma link C++ class AliPHOSPIDv1+;
#pragma link C++ class AliPHOSMemoryWatcher+;
+#pragma link C++ class AliPHOSRaw2Digits+;
+#pragma link C++ class AliPHOSBeamTestEvent+;
+#pragma link C++ class AliPHOSCalibrationDB+;
+#pragma link C++ class AliPHOSConTableDB+;
#endif
AliPHOSQAObjectCheckable.cxx AliPHOSQAChecker.cxx AliPHOSQAMeanChecker.cxx AliPHOSQAAlarm.cxx \
AliPHOSIhepAnalyze.cxx AliPHOSEvalRecPoint.cxx \
AliPHOSRecManager.cxx AliPHOSRecCpvManager.cxx AliPHOSRecEmcManager.cxx \
- AliPHOSClusterizerv2.cxx AliPHOSPIDv1.cxx AliPHOSMemoryWatcher.cxx
+ AliPHOSClusterizerv2.cxx AliPHOSPIDv1.cxx AliPHOSMemoryWatcher.cxx \
+ AliPHOSRaw2Digits.cxx AliPHOSBeamTestEvent.cxx AliPHOSCalibrationDB.cxx \
+ AliPHOSConTableDB.cxx
HDRS:= $(SRCS:.cxx=.h)