2 Contact: cvetan.cheshkov@cern.ch
6 Number of events needed: 10000
9 Trigger types used: PHYSICS
18 #define OUTPUT_FILE "SPDVertexDiamondDA.root"
19 #define CDB_STORAGE "local://$ALICE_ROOT"
20 #define N_EVENTS_AUTOSAVE 50
32 //int amore::da::Updated(char const*) {}
40 #include <TPluginManager.h>
44 #include "AliRawReaderDate.h"
45 #include "AliGeomManager.h"
46 #include "AliCDBManager.h"
47 #include "AliESDVertex.h"
48 #include "AliITSDetTypeRec.h"
49 #include "AliITSInitGeometry.h"
50 #include "AliITSVertexer3DTapan.h"
54 AliESDVertex* FitVertexDiamond(TH2F *hXY, TH1F *hZ);
56 int main(int argc, char **argv) {
58 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
63 TFitter *minuitFit = new TFitter(NFITPARAMS);
64 TVirtualFitter::SetFitter(minuitFit);
68 printf("Wrong number of arguments\n");
72 /* define data source : this is argument 1 */
73 status=monitorSetDataSource( argv[1] );
75 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
79 /* declare monitoring program */
80 status=monitorDeclareMp( __FILE__ );
82 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
86 /* define wait event timeout - 1s max */
88 monitorSetNoWaitNetworkTimeout(1000);
90 /* log start of process */
91 printf("Vertex-Diamond SPD DA started\n");
93 /* init some counters */
94 int nevents_with_vertex = 0;
95 int nevents_physics=0;
98 struct eventHeaderStruct *event;
102 if (getenv("DATE_RUN_NUMBER")==0) {
103 printf("DATE_RUN_NUMBER not properly set.\n");
106 int runNr = atoi(getenv("DATE_RUN_NUMBER"));
108 // Histograms initialization
109 TH2F *hXY = new TH2F("hXY","Vertex Diamond (Y vs X)",
110 2*(Int_t)(X_LIMIT/X_DELTA),-X_LIMIT,X_LIMIT,
111 2*(Int_t)(Y_LIMIT/Y_DELTA),-Y_LIMIT,Y_LIMIT);
112 TH1F *hZ = new TH1F("hZ"," Longitudinal Vertex Profile",
113 2*(Int_t)(Z_LIMIT/Z_DELTA),-Z_LIMIT,Z_LIMIT);
115 // Global initializations
116 AliCDBManager *man = AliCDBManager::Instance();
117 man->SetDefaultStorage(CDB_STORAGE);
119 AliGeomManager::LoadGeometry("geometry.root");
120 AliGeomManager::ApplyAlignObjsFromCDB("ITS");
122 // ITS initializations
123 AliITSInitGeometry initgeom;
124 AliITSgeom *geom = initgeom.CreateAliITSgeom();
125 printf("Geometry name: %s\n",(initgeom.GetGeometryName()).Data());
127 AliITSDetTypeRec *detTypeRec = new AliITSDetTypeRec();
128 detTypeRec->SetITSgeom(geom);
129 detTypeRec->SetDefaults();
130 detTypeRec->SetDefaultClusterFindersV2(kTRUE);
132 // Initialization of AMORE sender
134 amore::da::AmoreDA vtxAmore(amore::da::AmoreDA::kSender);
136 /* main loop (infinite) */
139 /* check shutdown condition */
140 if (daqDA_checkShutdown()) {break;}
142 /* get next event (blocking call until timeout) */
143 status=monitorGetEventDynamic((void **)&event);
144 if (status==MON_ERR_EOF) {
145 printf ("End of File detected\n");
146 break; /* end of monitoring file has been reached */
150 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
154 /* retry if got no event */
160 eventT=event->eventType;
161 switch (event->eventType){
166 /* END START OF RUN */
174 AliRawReader *rawReader = new AliRawReaderDate((void*)event);
176 // Run SPD cluster finder
177 TTree* clustersTree = new TTree("TreeR", "Reconstructed Points Container"); //make a tree
178 detTypeRec->DigitsToRecPoints(rawReader,clustersTree,"SPD");
181 AliITSVertexer3DTapan *vertexer = new AliITSVertexer3DTapan(geom,1000);
182 AliESDVertex *vtx = vertexer->FindVertexForCurrentEvent(clustersTree);
184 if (TMath::Abs(vtx->GetChi2()) < 0.1) {
185 // Fill the vertex into the histos
186 nevents_with_vertex++;
187 hXY->Fill(vtx->GetXv(),vtx->GetYv());
188 hZ->Fill(vtx->GetZv());
191 if ((nevents_with_vertex%N_EVENTS_AUTOSAVE) == 0) {
192 TFile outFile(OUTPUT_FILE, "update");
193 AliESDVertex *fitVtx = FitVertexDiamond(hXY,hZ);
195 fitVtx->Write(fitVtx->GetName(),TObject::kOverwrite);
196 TH1 *fithXY = fitFcn->CreateHistogram();
197 fithXY->Write(fithXY->GetName(),TObject::kOverwrite);
200 hXY->Write(hXY->GetName(),TObject::kOverwrite);
201 hZ->Write(hZ->GetName(),TObject::kOverwrite);
218 /* exit when last event received, no need to wait for TERM signal */
219 if (eventT==END_OF_RUN) {
220 printf("EOR event detected\n");
225 if (detTypeRec) delete detTypeRec;
227 // Store the final histograms
228 TFile outFile(OUTPUT_FILE, "update");
229 if (nevents_with_vertex > N_EVENTS_AUTOSAVE) {
230 // Fit XY & Z histograms
231 AliESDVertex *fitVtx = FitVertexDiamond(hXY,hZ);
233 fitVtx->Write(fitVtx->GetName(),TObject::kOverwrite);
234 TH1 *fithXY = fitFcn->CreateHistogram();
235 fithXY->Write(fithXY->GetName(),TObject::kOverwrite);
240 hXY->Write(hXY->GetName(),TObject::kOverwrite);
241 hZ->Write(hZ->GetName(),TObject::kOverwrite);
245 // send the histos to AMORE pool
246 printf("AMORE send status: %d",vtxAmore.Send(hXY->GetName(),hXY));
250 TVirtualFitter::SetFitter(0);
253 printf("Run #%s, received %d events with vertex, out of %d physics and out of %d total events\n",getenv("DATE_RUN_NUMBER"),nevents_with_vertex,nevents_physics,nevents_total);
257 /* export file to FXS */
258 if (daqDA_FES_storeFile(OUTPUT_FILE, "VertexDiamond")) {
265 Double_t fitFunction(Double_t *x, Double_t *par) {
267 Double_t t1 = x[0] - par[1];
268 Double_t t2 = x[1] - par[2];
270 return par[0]*TMath::Exp(-0.5*(t1*t1/(par[3]*par[3])+t2*t2/(par[4]*par[4])));
273 AliESDVertex* FitVertexDiamond(TH2F *hXY, TH1F *hZ)
277 fitFcn = new TF2("fitFcn",fitFunction,
279 -Y_LIMIT,Y_LIMIT,NFITPARAMS);
280 fitFcn->SetNpx(2*(Int_t)(X_LIMIT/X_DELTA));
281 fitFcn->SetNpy(2*(Int_t)(Y_LIMIT/Y_DELTA));
282 fitFcn->SetParameters(hXY->GetMaximum(),0,0,hXY->GetRMS(1),hXY->GetRMS(2));
286 if (hXY->Fit("fitFcn","L0V+") != 0) {
287 printf("XY fit failed!");
291 Double_t pos[3],poserr[3];
292 pos[0] = fitFcn->GetParameter(1);
293 pos[1] = fitFcn->GetParameter(2);
294 poserr[0] = fitFcn->GetParameter(3);
295 poserr[1] = fitFcn->GetParameter(4);
297 // Could be replaced by something more robust...
298 pos[2] = hZ->GetMean();
299 poserr[2] = hZ->GetRMS();
301 return new AliESDVertex(pos,poserr);